Ты путаешь Композиция с Ассоциация .
То, что вы нанесли на карту, является ассоциацией; Композиция в Hibernate (JPA) отображается с помощью аннотаций @Embeddable
/ @Embedded
. Ассоциации - это отношения между отдельными объектами; они обычно связаны через идентификаторы сущностей (внешние ключи в базе данных).
В вашем конкретном случае сущность Person
указывает на сущность Location
, что означает, что в таблице PERSONS
таблица имеет внешний ключ LOCATION_ID
(имена могут отличаться) на таблицу LOCATIONS
. То, что вы пытаетесь сделать, это обновить этот ключ на Location
конце, что недопустимо, потому что оно разорвало бы связь Hibernate (другой конец все еще содержит предыдущее значение ключа внутри).
Первичные ключи обычно должны быть суррогатными и не подлежать обновлению с самого начала; если вам нужно «обновить» его, вам придется либо отсоединить Location
от Person
, обновить Location
и снова присвоить его Person
ИЛИ создать новый экземпляр Location
и назначить его своему Person
.
Все это говорит о том, что если вы действительно пытаетесь смоделировать отношения композиции, вам нужно заменить @ManyToOne на @Embedded и соответственно изменить схему таблицы. Вот ссылка на
Документация Hibernate Annotations для компонентов сопоставления .
Кроме того, указание типов каскадов в двух отдельных аннотациях (расширение JPA и расширение Hibernate) не очень хорошая вещь. Если вам действительно нужно расширение Hibernate (которое в данном случае вам не нужно), просто используйте его и оставьте атрибут cascade
в аннотациях JPA пустым.