私の現在のプロジェクトは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()を使用して、エンティティを非管理対象として使用し、必要に応じてマージできるようにします。
しかし、あなたが適切な解決策を持っているなら、私は興味があります:)
再度、感謝します