2009-08-27 3 views
2

У меня есть Person лицо, которое имеет состав с Location EntityОбновление от Composite Entity терпит неудачу

@ManyToOne(fetch = FetchType.EAGER, cascade = 
{ CascadeType.PERSIST, CascadeType.MERGE }) 
@Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE }) 
public Location getLocation() 
{ 
    return location; 
} 

И Местоположение Entity имеет имя, как Id

@Id 
public String getName() 
{ 
    return name; 
} 

Я получаю следующее исключение, когда расположение персоны изменяется от L1 до L2 в форме Spring MVC, где этот объект Person является атрибутом modelAttribute для формы.

org.springframework.orm.hibernate3.HibernateSystemException: идентификатор экземпляра com.x.y.z.Location был изменен из L2 к L1; вложенное исключение org.hibernate.HibernateException: идентификатор экземпляра com.x.y.z.Location был изменен из L2 в L1

ответ

3

Ты путаешь Composition с Association.

То, что вы настроили, является ассоциацией; композиция в Hibernate (JPA) отображается через @Embeddable/@Embedded аннотации. Ассоциации - это отношения между отдельными сущностями; они обычно связаны через идентификаторы сущностей (внешние ключи в базе данных).

В вашем конкретном случае, Person сущности указывает на Location лица, которое означает, что в таблице базы данных PERSONS имеет LOCATION_ID внешний ключ (названия могут отличаться) к LOCATIONS таблице. То, что вы пытаетесь сделать, - это обновить этот ключ на конце Location, который является незаконным, поскольку он будет разорвать отношения Hibernate (на другом конце все еще сохраняется предыдущее значение ключа внутри).

Первичные ключи обычно должны быть суррогатными и не обновляемыми для начала; если вам нужно «обновить» его, вам придется либо disassociate Location от Person, обновите Location и назначьте его Person еще раз или создайте новый экземпляр Location и назначьте его своему Person.

Все, что говорилось, если вы действительно пытаетесь моделировать отношения композиции, вам необходимо заменить @ManyToOne на @Embedded и соответственно изменить схему таблицы. Вот ссылка на Документация аннотации Hibernate на mapping components.

Кроме того, указание типов каскадов в двух отдельных аннотациях (JPA против расширения Hibernate) не очень хорошо. Если вам действительно нужен расширение Hibernate (которого вы не делаете в этом случае), просто используйте его и оставьте атрибут cascade в аннотации JPA пустым.

+0

Thank you. это помогло. –

0

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

0

В местоположений объекта атрибута идентификатор тип был изменен в вашем классе модели .Please см идентификатор и отображение атрибутов типов идентификаторов такие же Убеждайтесь что атрибут ID получателя и сеттер возврата функции типов.

Смежные вопросы