2

我使用 Hibernate 作为 JPA 提供程序,在一个函数中,我正在创建不同实体的实例。一旦我调用clear()一个实体,我就不能调用persist()其他实体。我的代码相当复杂,有时我不得不为一种类型的实体(而不是其他类型)调用flush()andclear()以释放一些内存。

我的代码的简化如下:

@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: detached entity passing to persist

4

1 回答 1

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将被视为detached

如果您只想从会话缓存中删除一个实体,请使用evict()

于 2012-08-10T14:44:39.203 回答