java – Hibernate中的OneToMany单向映射.在引用实体中设置外键设置
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Hibernate中的OneToMany单向映射.在引用实体中设置外键设置,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2322字,纯文字阅读大概需要4分钟。
内容图文
假设有两个实体:Parent和Child,其中@OneToMany映射从Parent到Child.
class Parent {
@Column(name="id")
private Long id;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id", referencedColumnName = "id")
private List<Child> children;
}
class Child {
@Column(name="id")
private Long id;
@Column(name="parent_id")
private Long parentId;
}
正如您所看到的,在我的例子中,Child表将一个外键存储到Parent的主键中.但我不希望这在我的Child实体中作为双向映射.
现在出现的问题是,我无法在Child实例中设置parent_id.
我创建了这样的实例:
Parent parent = new Parent();
parent.setChildren(Lists.newArrayList(new Child(), new Child()));
parentDomainService.save(parent);
假设父端有级联.此方法首先保存Parent,然后保存Child实例.然后它在子实例上运行更新查询以更新parent_id,正如我从Hibernate show_sql日志中看到的那样.但令人惊讶的是,在更新查询后,我看到一些孩子,parent_id为null.这让我感到惊讶.
所以,我去手动处理那个东西,并删除了级联.然后我保存了这样的实体:
Parent parent = new Parent();
parent.setChildren(Lists.newArrayList(new Child(), new Child()));
parent = parentDomainService.save(parent);
for (Child child: parent.getChildren()) {
child.setParentId(parent.getId());
}
childDomainService.save(parent.getChildren());
这一个反弹在我身上,但有以下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.somepkg.Child
我已经在SO上看到了很多关于异常的问题,我知道有很多问题,但是几乎所有这些问题都涉及双向映射,或者使用JoinTable进行单向映射.它们都不适合我的情况.
这有什么灯吗?我没有选择.
P.S.:我正在处理的实际场景需要节省大量数据.例如:50000个父记录和250000个子记录.这就是为什么我不想要双向映射.因为保存Child会在后端创建一个带有连接表的查询.
我最感兴趣的是解决方案,其中我不必在Child表上触发两次查询.正如我当前的应用程序中发生的那样,这妨碍了性能.
解决方法:
当您删除级联时,父级不会保留引用的子元素和
parent = parentDomainService.save(parent);
父引用“未保存的瞬态”子实例,因此抛出异常.如果您先保存父项,然后添加子项:
Parent parent = new Parent();
parent = parentDomainService.save(parent);
parent.setChildren(Lists.newArrayList(new Child(), new Child()));
for (Child child: parent.getChildren()) {
child.setParentId(parent.getId());
}
childDomainService.save(parent.getChildren());
然后不会抛出异常.
内容总结
以上是互联网集市为您收集整理的java – Hibernate中的OneToMany单向映射.在引用实体中设置外键设置全部内容,希望文章能够帮你解决java – Hibernate中的OneToMany单向映射.在引用实体中设置外键设置所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。