У меня есть 3 класса:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class Tag {
@Id
private String id;
private String name;
}
@Entity
@Table(uniqueConstraints=
@UniqueConstraint(columnNames={"name"}))
public class SystemTag extends Tag {
}
@Entity
@Table(uniqueConstraints=
@UniqueConstraint(columnNames = {"name", "user"}))
public class CustomTag extends Tag{
@ManyToOne
private User user;
}
поэтому я хочу использовать уникальное имя для системных тегов и уникальную пару имен для пользовательских тегов (несколько пользователей могут создавать те же теги). Но я получаю два предупреждения, как показано ниже:
<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.CustomTag
<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.SystemTag
И это позволяет мне создавать два системных тега с одинаковым именем и двумя настраиваемыми тегами с одинаковым именем для одного пользователя.
Как я могу справиться с этим?
Если вы используете одну таблицу, которая, очевидно, не будет работать.
Перейти к использованию стратегии JOINED
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Tag {
@Id
private String id;
private String name;
}
и тогда у вас будет таблица для CustomTag и таблица для SystemTag с уникальными ограничениями, как ожидалось.