我使用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:传递给persist的分离实体
答案 0 :(得分:4)
您的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
的所有诱惑都将被视为已分离。
如果您只想从会话缓存中删除一个实体,请使用evict()