Двунаправленный @ OneToOne
Чтобы создать уникальное ограничение, необходимо создать полное двунаправленное отношение OneToOne
.
Это означает, что вы должны добавить @OneToOne
аннотацию к сущности Parent ( Owning ) и добавьте @OneToOne(mappedBy="...")
к сущности Child .
Это создаст уникальное ограничение для вашего столбца id .
В противном случае вы моделируете два разных отношения вместо одного двунаправленного отношения; из-за этого ничто не мешает текущей модели иметь двух дочерних элементов, указывающих на одного и того же родителя.
Официальная аннотация JavaDo c для @OneToOne содержит дополнительную информацию о дополнительных параметрах и рекомендации по двунаправленное отношение.
UPD: ссылка на hibernate спецификация о том, как обрабатывается отношение @OneToOne
:
- Когда используя двунаправленную ассоциацию @ OneToOne , Hibernate применяет уникальное ограничение при извлечении дочерней стороны.
- Однонаправленная ассоциация следует семантике внешнего ключа реляционной базы данных, причем клиентская сторона владеет отношением.
В вашем случае
Это означает, что в вашей модели B
сущности вы должны добавить поле с вашей сущностью A
и аннотировать его с помощью @OneToOne(mappedBy="b")
, чтобы установить вашу связь двунаправленный и полный, ограничивающий доступ к одному Родителю и создающий уникальное ограничение.