0

我有一个实用程序可以使用两个实体管理器在两个不同的数据库之间复制实体。

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 中显式地由持有者映射,则会复制连接列,但我无法将模型更改为双向。

关于什么可能是错误的任何想法?在同一个 entityManager 中分离和合并也可以正常工作。 更新:生成的 sql 不包含 HOLDER_ID 更新,因此在同一个 entityManager 中也“失败”。

(我使用 Hibernate 作为 JPA 提供程序)。

4

1 回答 1

0

好的,我发现表为空时生成的sql是

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

但是如果表格包含 Holder 但不包含碎片

1/ Insert for each Piece

这就是碎片损失参考持有人的原因。

于 2012-05-18T09:15:38.633 回答