объединить с Hibernate, вызывая ошибку с грязными объектами - PullRequest
2 голосов
/ 10 ноября 2008

Я использую Hibernate с Spring в своем приложении. Я постоянно использую отдельные объекты и присоединяю их всякий раз, когда мне нужно сделать вызовы в базу данных. Я использую шаблон гибернации, чтобы позаботиться об управлении соединениями для меня.

Моя структура данных выглядит следующим образом:

classA: 
   <one-to-many name="classB" inverse="true" cascade="all,delete-orphan" lazy="true">

classB:
   <one-to-many name="classC" inverse="true" cascade="all,delete-orphan" lazy="false" fetch="subselect">

Когда я выполняю следующий вызов с вероятностью изменения некоторых элементов в classB или classC, я получаю сообщение об ошибке:

classA a = (classA)hibernateTemplate.merge(newClassA);

Я получаю ошибку:

[11/10/08 12:08:39:126 EST] 00000024 SystemOut     O 2008-11-10 12:08:38,876  -  - ca.thedominion.cfa.persistence.hibernate.ClassADAOImpl  :updateClassA Technical Exception occurred: 
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [ca...classC#715590]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:639)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:820)

Может кто-нибудь объяснить мне, почему это вызывает ошибку? Насколько я понимаю, слияние должно определять, какие объекты в дереве были изменены, и обновлять / удалять / вставлять их, а не пытаться удалять и повторно вставлять любые другие объекты. Но похоже, что он пытается удалить все элементы типа classC и вставить их заново.

1 Ответ

4 голосов
/ 11 ноября 2008

Судя по всему, вы удалили один из ваших classC, но он остался в одной из коллекций. Теперь Hibernate не понимает, что делать: вы удалили его, но в коллекции есть каскад = "все" (включая сохранение), и вы собираетесь сохранить коллекцию (включая удаленный объект).

Вы должны удалить объект classC из коллекции, а не удалять его напрямую, или выполнить оба действия (удалить и удалить из коллекции).

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