2017-10-15 8 views
0

私は、1つ以上のリレーションシップ(1つのリクエストレコードとリクエスト詳細レコード)の非常に典型的なシナリオを持っており、 hibernateを使って変更した後で再度保存します...クライアントの側で詳細レコードの1つが削除され、削除されたことを保持したいとします(データベースから削除します)...現在のロジックは以下を行います(各更新時に):すべてのスレーブレコードを再度取得し、クライアント入力を永続レコードと比較します。レコードが欠落している場合は削除されますので、session.deleteが呼び出され、指定レコードが削除されます。更新されましたsession.update ....これを行うことなくレコードが削除されたことをプロバイダに通知する別の方法があるのだろうかと思いますomparison ...どんな助け?1対多数のマスター/ディテール関係の詳細の削除を処理する - 休止状態

答えて

-1

あなたはカスケードを使用してのようなあなたの親の変更の影響の子を作るために孤児オプション削除することができます。

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval=true) 

を次に、分離インスタンスの再付着のためSession.update()またはSession.merge()を使用する必要があります。このようにすると、トランザクションの最後に(コミット時に)変更が保存されます。

session.persist(a1); 
    session.flush(); 
    session.getTransaction().commit();//a1 saved 

    session.evict(a1);//a1 detached 

    a1.getTableBs().remove(0);//remove child 

    session.beginTransaction(); 
    session.update(a1);//reattach a1 
    session.flush(); 
    session.getTransaction().commit(); 

    session.close(); 

そして、私のトランザクションの終了時に子供を削除するには、次のように実行クエリを休止:

これは私のコード例である私が知っているよう

Hibernate: 
delete 
from 
    TABLE_B 
where 
    ID=? 
+0

、孤児の除去は動作しません。孤立したオブジェクトがデタッチされている限り、データベースからエンティティ全体を再度読み取る必要があります...指定された詳細オブジェクトを削除してから更新してください...同じシナリオですか –

+0

それは機能しません。 (マージ/更新を使用して)アタッチすると、コミット時に削除された子が削除されます。これが私の地域でこれを試してください。 – Angga

+0

私はちょうど私のコードでそれを試して、エンティティが管理される前に削除が行われた場合、エンティティが管理されている間に削除が完了した場合にのみ動作し、データベースに反映されません。詳細は追加されますが、削除された詳細はデータベースに残ります –

関連する問題