Hibernate: @UniqueConstraint для нескольких таблиц? - PullRequest
2 голосов
/ 24 мая 2011

У меня есть модель данных, в которой несколько объектов наследуют некоторые общие атрибуты от одной сущности суперкласса. Я использую InheritanceType.JOINED в суперклассе, в результате чего Hibernate создает единую таблицу для атрибутов, определенных в суперклассе, с таблицами подкласса, содержащими только столбцы, которые добавляются подклассом (поэтому для загрузки атрибутов для экземпляра подкласса используется соединение выполняется между двумя таблицами). Это все работает нормально.

Однако я хотел бы указать уникальное ограничение, включающее поля в таблицах подкласса и суперкласса. Например, скажем, что моя сущность суперкласса выглядит примерно так:

Thing: {id, name}

... а затем у меня есть несколько подклассов, таких как:

Company: {address}  //inherits 'id' and 'name' from 'Thing'
Employee: {company} //inherits 'id' and 'name' from 'Thing'

... и я хочу настроить Hibernate на автоматическое принудительное применение того, что данный Company не может иметь два Employee с одинаковым именем. Поле company находится в таблице Employee, но поле name находится в таблице Thing, поэтому есть ли способ заставить Hibernate применить это ограничение, или мне нужно делать это программно всякий раз, когда я добавить новый Employee?

Ответы [ 2 ]

5 голосов
/ 24 мая 2011

Если это невозможно в базе данных, это невозможно с Hibernate. Вы не можете создать одно ограничение для нескольких таблиц с помощью SQL, как и в Hibernate.

Вы можете обойти эту проблему, создав новую сущность, содержащую только идентификатор компании и сотрудника, и установив уникальное ограничение для этих двух полей, но я бы порекомендовал применять это программно.

2 голосов
/ 24 мая 2011

Вы можете , а не использовать InheritanceType.JOINED, тогда все заканчивается огромной таблицей, и вы можете написать свое ограничение.Как было сказано ранее: то, что вы хотите, просто невозможно в реляционной БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...