0

2 つのエンティティ マネージャーを使用して、2 つの異なるデータベース間でエンティティをコピーするユーティリティがあります。

Query q = em1.createQuery("SELECT o FROM Holder o WHERE o.id=1");
Holder holder = (List<Holder>) q.getSingleResult();
em1.clear();
em2.getTransaction().begin();
em2.merge(holder);
em2.getTransaction().commit(); 

oneToMany 関係を除いて、すべて正常に動作します。

@Entity
public class Holder{
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "HOLDER_ID")
private Set<Piece> pieces;
}
@Entity
public class Piece{
//No mapped by to holder
}

操作の結果、ホルダーは正常に永続化され、ピースも永続化されますが、HOLDER_IDは null です。Piece でマップされたホルダーを明示すると、joincolumn がコピーされますが、モデルを双方向に変更することはできません。

何が間違っている可能性がありますか?同じ entityManager でのデタッチとマージも正常に機能します。 UPDATE : 生成された SQL には HOLDER_ID の更新が含まれていないため、同じエンティティ マネージャーでも「失敗」します。

(JPA プロバイダーとして Hibernate を使用しています)。

4

1 に答える 1

0

OK、テーブルが空の場合に生成されるSQLが

1/ Insert for Holder
2/ Insert for each Piece
3/ Update to setup Holder_id in each Piece

ただし、テーブルにホルダーが含まれているがピースが含まれていない場合

1/ Insert for each Piece

それがピースがホルダーへの参照を失う理由です。

于 2012-05-18T09:15:38.633 に答える