В транзакционной функции вызов clear() отсоединяет все сущности?

Я использую Hibernate в качестве провайдера JPA и в функции создаю экземпляр разных объектов. Как только я вызываю clear() для одного объекта, я не могу persist() для других объектов. Мой код намного сложнее, и в какой-то момент я вынужден вызывать flush() и clear() для одного типа сущностей (и НЕ для других типов), чтобы освободить память.

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

@Transactional
void function()
{
    EntityType1 entity1 = new  EntityType1();
    EntityType2 entity2 = new  EntityType2();

    //...... do operations on entity1
    entity1.persist();
    entity1.flush();
    entity1.clear();

    //...... do operations on entity2
    entity2.persist();
}

При вызове entity2.persist() у меня возникает следующая ошибка: org.springframework.orm.jpa.JpaSystemException: org.hibernate.PersistentObjectException: отдельный объект передается для сохранения


person Rami    schedule 10.08.2012    source источник
comment
Вашему entity2 уже назначен id? ... если это так, Hibernate ожидает обновления объекта, а не сохранения нового экземпляра. В этом случае вызовите merge() для присоединения экземпляра перед вызовом persist()   -  person Brad    schedule 10.08.2012
comment
Привет, Брэд, да! Моему объекту2 назначен идентификатор! большое спасибо за совет! но какова связь между очисткой объекта 1 и сохранением объекта 2 с использованием слияния (), а не сохранения ()?   -  person Rami    schedule 10.08.2012


Ответы (1)


Скорее всего, вашему entity2 уже назначен @Id, и поэтому Hibernate ожидает обновления существующего объекта, а не сохранения нового экземпляра. Вот почему Hibernate считает entity2 отсоединенным.

Вызов entity2.merge() предоставит вам связанный объект для сеанса Hibernate. Имейте в виду, что merge() возвращает новый экземпляр вашего объекта, который является сохраненной копией.

Пример

EntityType2 entityPersisted = entity2.merge();

entityPersisted.getSomething();  // your persisted instance
entity2.getSomething();  // still your detached instance

Вызов clear() вытесняет весь кеш вашего сеанса, поэтому все сущности, которые у вас есть с @Id, будут считаться отсоединенными.

Если вы хотите удалить только один объект из кэша сеанса, используйте выселение()

person Brad    schedule 10.08.2012