休止状態を使用してDBからエンティティをフェッチし、それをコピーして休止状態へのリンクをすべて削除し、必要に応じてコピーを永続化します。最終的に、オリジナルとコピーの両方が DB に存在します。
私のエンティティには、多くの子エンティティ、孫などがあります。それらのいくつかは、コレクションにさえあるかもしれません。
コピーは深層再帰コピーでなければなりません。つまり、子もコピーして新しいオブジェクトに入れる必要があります。
私は beanLib を使用していますが、エンティティを正しくコピーしています。Persistend bads は Array リストに変換され、子をチェックして、元のオブジェクトとは異なるオブジェクトであるかどうかを確認しました。これが私のコードです:
Session sess = getDbSession();
Dossier doss = (Dossier) sess.createCriteria(Dossier.class)
.add(Restrictions.eq("id", 1249))
.uniqueResult();
Hibernate3BeanReplicator rep = new Hibernate3BeanReplicator();
rep.initPropertyFilter(new MyBeanLibPropertyFilter()); // filters ids. works correctly
Dossier doss2 = rep.copy(doss, Dossier.class);
2 つの問題があります。
1-コピーの子の 1 つの値が null に設定されています。それらは解決しました!ゲッターとセッターは、命名規則に従って名前が付けられていませんでした。nullable=false
休止状態の注釈にあり、私がチェックしたところ、元の値があります。フィールドのタイプはDouble
(関連するかどうかわからない) です。
2-を使用解決しました!ないsession.persist(doss2)
してもオブジェクトは保持されません。セッションを閉じてからもう一度開いてみましたが、成功しませんでした。tx.commit();
SO 私が自分の質問に答えるのを妨げている場合。できたら、回答を投稿します。
私は何を間違っていますか?
編集:コミットコード:
Transaction tx = null;
try {
tx = sess.beginTransaction();
sess.save(doss2);
tx.commit();
sess.flush();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
throw e;
}