我有一个实用程序,可以使用两个实体管理器在两个不同的数据库之间复制实体。
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为空。 如果我在Piece中显示了一个holder的映射,则会复制joincolumn,但我无法将模型更改为双向。
任何可能出错的想法?在同一个entityManager中分离和合并也可以正常工作。 UPDATE :生成的sql不包含HOLDER_ID更新,因此在同一个entityManager中也“失败”。
(我正在使用Hibernate作为JPA提供程序)。
答案 0 :(得分:0)
好的,我发现如果表是空的,那么生成的sql是
1/ Insert for Holder
2/ Insert for each Piece
3/ Update to setup Holder_id in each Piece
但如果表格包含持有人但不包含作品
1/ Insert for each Piece
这就是碎片损失引用Holder的原因。