JPA - назначить разные уникальные ограничения для двух подклассов абстрактного класса иерархии SINGLE_TABLE

1

У меня есть 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

И это позволяет мне создавать два системных тега с одинаковым именем и двумя настраиваемыми тегами с одинаковым именем для одного пользователя.

Как я могу справиться с этим?

Теги:
hibernate
jpa

1 ответ

1
Лучший ответ

Если вы используете одну таблицу, которая, очевидно, не будет работать.

Перейти к использованию стратегии JOINED

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Tag {
    @Id
    private String id;
    private String name;
}

и тогда у вас будет таблица для CustomTag и таблица для SystemTag с уникальными ограничениями, как ожидалось.

  • 0
    в проекте руководитель проекта решил использовать его как единую таблицу, но я думаю, что я должен использовать ее как объединенную или таблицу для каждого класса. Спасибо, в любом случае :)
  • 0
    Вы можете использовать 1 таблицу с дискриминатором. Зависит от ваших уникальных ключевых требований. Если вы создадите ключ для имени / пользователя и забудете об уникальном имени, которое может работать в зависимости от вашей базы данных. например, для записей 1 / alan / null, 2 / alan / abc, 3 / alan / xyz не должно быть проблем: stackoverflow.com/a/767702/1356423

Ещё вопросы

Сообщество Overcoder
Наверх
Меню