0

私はインポート機能に取り組んでおり、ファイルからデータをインポートし、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を呼び出した順序を維持していないようです。誰かが私にこれに関するいくつかの提案を提供できますか?質問が明確でない場合はお知らせください。

4

1 に答える 1

0

Collections.clear()は削除と同じではありません。挿入する前に確実に削除するために、明示的な削除を呼び出す必要があります。それ以外の場合、セッションが終了すると、暗黙的な削除が実行されます。

于 2012-11-19T10:17:46.083 に答える