私はインポート機能に取り組んでおり、ファイルからデータをインポートし、hibernateを使用してデータベースに更新する必要があります。
オブジェクトの構造は次のとおりです。親があり、子のセットがあります。
インポートを行うときは、最初に既存の子をすべて削除してから、ファイルから読み取った新しい子を追加します。
私のやり方は以下の通りです
parent = session.load(<id of parent>)
parent.getchildrenSet.clear()
parent.saveOrUpdate(parent);
次に、ループで新しい子を作成し、それを親のchildrenSetに追加します。それで
parent.saveOrUpdate(parent);
マッピングは以下の通りです
親で
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CHILD_TABLE", joinColumns = { @JoinColumn(name = "CHILD_PARENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "CHILD_ID") })
@MapKeyColumn(name = "CHILD_ID")
private Map<Long, Children> childrenMap;
子供の中で
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "CHILD_PARENT_ID")
private Parent parent;
このコードを実行すると、ログが次の順序でDMLを出力することを期待していました
1.すべての子を削除します
2.新しい子を挿入し
ます3.親を更新します
ただし、出力されるのは
1.新しい子を挿入
する2.親を更新する
3.すべての子を削除する
したがって、上記の順序の結果として、インポートのために新しく追加した子も含めて、すべての子が親から削除されます。
hibernateはDMLを呼び出した順序を維持していないようです。誰かが私にこれに関するいくつかの提案を提供できますか?質問が明確でない場合はお知らせください。