2

Hibernate を JPA プロバイダーとして使用しており、関数内でさまざまなエンティティのインスタンスを作成しています。1 つのエンティティを呼び出すと、他のエンティティを呼び出すclear()ことはできませんpersist()。私のコードはかなり複雑で、ある時点で、一部のメモリを解放するために、エンティティの 1 つのタイプ (他のタイプではなく) に対してflush()andを呼び出す必要があります。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: detached entity passed to persist

4

1 に答える 1

4

ほとんどの場合、entity2すでに@Id割り当てられているため、Hibernate は新しいインスタンスを永続化するのではなく、既存のエンティティを更新することを期待しています。これが、Hibernateentity2detachedであると見なす理由です。

呼び出すentity2.merge()と、Hibernate セッションに関連付けられたエンティティが提供されます。merge()は、永続化されたコピーであるエンティティの新しいインスタンスを返すことに注意してください。

EntityType2 entityPersisted = entity2.merge();

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

clear()を呼び出すと、セッション キャッシュ全体が削除されるため、 を持つエンティティはすべてdetached@Idと見なされます。

セッション キャッシュから 1 つのエンティティのみを削除する場合は、evict()を使用します。

于 2012-08-10T14:44:39.203 に答える