0

ここで非常に奇妙な状況に遭遇しました。エンティティのセットを削除しようとすると、すぐに別のエンティティのセットを追加しようとすると、同じ要素を持つ場合と持たない場合がありますが、以下の例外が発生しているようです。スタック トレース全体はあまり意味がないため、必要ありません。

javax.persistence.EntityNotFoundException: deleted entity passed to persist [com.test.MyEntity#<null>]

自分自身をより明確にするために、より詳細な説明をさせてください。

これは私のエンティティです。

@Entity
@Table(name = "MY_ENTITY")
@SequenceGenerator(name = "my_enty_seq", sequenceName = "MY_ENTITY_SEQ")
public class MyEntity {

    private long id;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_enty_seq")
    @Column(name = "ID", unique = true, nullable = false, precision = 12, scale = 0)
    public long getId() {
        return this.id;
    }

    // Other methods & variables which are not relevant here.
}

これがエンティティで遊ぶクラスです。

public class MyEntityServiceImpl implements MyEntityService {

    public void updateMyEntities(List<MyEntity> newEntities) {

        // Delete the Old Items
        List<MyEntity> oldEntities = myDAO.getAllEntities();
        myDAO.delete(oldEntities); // myDAO extends GenericDaoJpaWithoutJpaTemplate, hence, the DELETE is available in it.

        // Add the New Items
        myDAO.store(newEntities); // This is where I get the mentioned Exception.
    }

    // Other non-relevant stuffs
}

メソッドで前述の例外が発生するシナリオは、 oldEntitiesリストとnewEntitiesstore()リストの両方に共通MyEntityのオブジェクトがある場合です。

これを機能させるためにかなりのことを試しましたが、問題を克服するのに役立つものは何もありませんでした。FetchType.EAGER&の追加CascaseType.ALL, CascaseType.PERSISTも機能しませんでした。jpaEntityManagerにもメソッドがないようです。これは、メソッドの前後にcommit()使用できます。私も( store 内部的に呼び出しますが)と交換してみました!delete()store()store()persist()persist()

注:-要素を比較して新しいリストのみを追加するのは面倒なので、古いリストを削除して新しいリストを挿入する必要があります (リストは時々かなり巨大になる可能性があります)。

4

2 に答える 2

0

私はこれのための方法を考え出した。flushAndClear()メソッドの代わりにメソッドを使用しましたflush()

flush()永続キャッシュをDBと同期しただけのようですが、クリアしませんでした。

flushAndClear()一方、保留中のすべての操作を実行してから、すべてをクリアします。

org.crank.crud.GenericDao<T, PK extends Serializable>削除メソッドのソースコードにあるJavaドキュメントから引用すると、

データベースの永続ストレージからオブジェクトを削除します。これは PK を使用して削除を行うため、ID 1 のオブジェクトを削除してもそのオブジェクトがまだエンティティ マネージャのキャッシュにある場合、エンティティ マネージャが一貫性のない状態のままになる可能性があります。

2 つのことを行うことができます。すべての PK 削除をまとめて、完了したら flushAndClear を呼び出します。または、この問題の影響を受けないエンティティで delete メソッドを呼び出すだけです。

flushAndClear()メソッドを使用する最初のオプションを試してみましたが、期待どおりに機能しました。

于 2013-05-13T06:26:28.570 に答える