1

私の現在のプロジェクトはJavaFXを使用して行われます。プロパティを使用して(双方向の)ビューフィールドをBeanにバインドします(JFXtrasのBeanPathAdapterを使用)。

モデルとしてObjectDBでJPAを使用することを選択します。

スタンドアロンプ​​ロジェクトでJPAを使用するのはこれが初めてであり、ここで管理対象エンティティの問題に直面しています。

実際、私は管理対象エンティティをビューフィールドにバインドし、ビューフィールドの値が変更されると、エンティティが更新されます...データベースも更新されます。

エンティティを手動で永続化/マージする方法を見つけようとしているので、ユーザーに保存するかどうかを尋ねることができます。

リストを取得するために使用するコードは次のとおりです。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("$objectdb/data/db.odb");
EntityManager em = emf.createEntityManager();

List<XXX> entities = em.createQuery("SELECT x FROM XXX x").getResultList();

だから私がするとき

entity.setName("test");

エンティティはデータベースで更新されます。

私が探しているのは、エンティティが自動的に更新されないことです。

試しました(getResultListの直後)

em.clear();

また

em.detach(entity);

ただし、CascadeType.DETACHを使用してもリレーションインスタンスは失われます。

私も試しました

em.setFlushMode(FlushModeType.COMMIT);

しかし、それでも自動的に更新されます...

また、オブジェクトのクローンを作成しようとしました。しかし、私がそれをマージしたいとき、それは私に例外を与えます:

Attempt to reuse an existing primary key value

別の解決策を考えました。変数を「バッファ」として使用し、ユーザーが保存する場合はマネージドBeanをバッファで埋めます。しかし、BeanPathAdapterはその意味を失います。これは、ビューフィールドに手動で入力し、保存後にBeanフィールドに手動で入力するのと同じです。

解決策を見つけるのを手伝ってもらえますか?

ありがとう、

スモーキー

編集: 私は自分の質問に答えます:p

3時間の調査の後、私は解決策を見つけました。

「クローン作成」ソリューションは、私が引用したそれぞれの「最高」でしたが、それが最高のものではないと思います。

例外の原因は、エンティティを永続化/マージするために使用したコードでした。既存のIDで管理されていないエンティティを永続化していた。マージしていると思った...

二度と失敗しないように一般的な方法を実行しました

public <T extends IEntity> T persist(T object) {
    em.getTransaction().begin();

    if (object.getId() == null) {
        em.persist(object);
        em.flush();

        em.getTransaction().commit();

        em.refresh(object);
    }
    else {
        object = em.merge(object);

        em.getTransaction().commit();
    }

    return object;
}

したがって、解決策:エンティティをビューにバインドする必要がある場合は、entity.clone()を使用して、エンティティを非管理対象として使用し、必要に応じてマージできるようにします。

しかし、あなたが適切な解決策を持っているなら、私は興味があります:)

再度、感謝します

4

1 に答える 1

2

上記のソリューションに加えて、標準的なソリューションは次のとおりです。

  • モデルで切り離されたオブジェクトを使用し、それらを EntityManager にマージします。
  • モデルでマネージド オブジェクトを使用し、EntityManager を開いたままにします (デタッチ/マージなし)。
于 2013-02-26T15:05:52.910 に答える