如何解决OneToOne 双向休眠 - 如何替换孩子并坚持?
如何成功“替换”双向 oneToOne 关系的孩子?
我有一个父子一对一双向关系,共享主键设置成功。
- 我可以成功地创建/保留一个分离的/新的父子节点。子键已正确更新。
- 我可以通过关系检索父项并访问子项。
- 我可以修改父项、子项或两者的属性并成功更新。
- 我可以通过设置 parent.setChild(null) 来移除孩子,更新会删除孩子。
然而,我无法成功地用一个分离的孩子替换孩子。
Class Parent {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "CLAIMNUMBER_GENERATOR")
@Column(name = "CLAIM_NUMBER")
private long claimNumber;
@OneToOne(mappedBy = "parent",fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE},orphanRemoval = true)
private Child child;
}
Class Child {
@Id
@Column(name = "CLAIM_NUMBER")
private long claimNumber;
@OneToOne
@MapsId
@JoinColumn(name = "CLAIM_NUMBER")
private Parent parent;
}
我的测试 - 伪代码
1. Start transaction
2. Create and persist new parent and child
3. em.flush
4. parent = session.get(Parent.class,parent.getClaimNumber())
5. newChild = Build new/detached child with ID (ie. claimNumber) equal zero
6. parent.setChild(newChild)
7. newChild.setParent(parent)
8. session.merge(parent) <--- dies here
9. em.flush
在它死的时候,我得到一个例外:
javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [Child#xxxxx]
另外,我也试过不成功:
- 在添加新子项之前,将原始子项中的 ID 设置为零并将父项设置为 null。
- 在添加新子级之前,将父级中的子级属性设置为 null。**
- 尝试在子对象上实现 hashcode() 和 equals() 以帮助休眠将其识别为不同的对象。
**如果我在父级中将子属性设置为 null 后刷新()。它有效,但我认为在整个代码中使用它不是一个非常好的(透明/直观)解决方案。使用 ORM 层时感觉没有必要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。