在Transactional函数中,调用clear()分离所有实体?

时间:2012-08-10 14:21:45

标签: spring hibernate jpa transactional persist

我使用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的分离实体

1 个答案:

答案 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()