Слияние с гибернацией, вызывающее ошибку с грязными объектами

Я использую 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 и снова вставить их.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
5 478
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме