博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次hibernate一对多问题的解决
阅读量:6554 次
发布时间:2019-06-24

本文共 1265 字,大约阅读时间需要 4 分钟。

hot3.png

最初的配置如下:

public class Order extends BaseEntity {...@OneToMany(cascade=CascadeType.ALL,mappedBy="order", fetch = FetchType.EAGER)public Set
 getOrderGoodPics() { return orderGoodPics; }}public class OrderGoodsPic extends BaseEntity {@ManyToOne(cascade={CascadeType.ALL})               @JoinColumn(name="order_id")     public Order getOrder() { return order; }}

同事配置了又向一对多的关系,因为这个表的数据要传给客户端,之间通过json,使用了com.fasterxml.jackson这个jar包,在解析时因为没有忽略对OrderGoodsPic多对一的转换,导致转换时会进入死循环。

后改成以下配置:

public class Order extends BaseEntity {。。。@OneToMany(cascade=CascadeType.REMOVE,fetch=FetchType.EAGER) 	@JoinColumn(name="order_id")	public Set
 getOrderGoodPics() { return orderGoodPics; }。。。}public class OrderGoodsPic extends BaseEntity {...@Column(name="order_id", length=32)    public String getOrderId() {        return this.orderId;    } ....}

改成了单向一对多。

这时虽然不会死循环,但由于配置了FetchType.EAGER,导致hibernate在取数据时使用了left outter join把所有数据一起取出来,这样就使得查出来的数据实际上很多是重复的,比如一个单子对应有多个图片的话,就会查出多个重复的数据,网上找了一下,基本上没很好的解决方案好象。

所以最好参照网上的方案,把延迟加载属性加上fetch=FetchType.LAZY,然后在加载order记录时再手工的写代码获取图片的数据,使得hibernate会先把这些数据加载出来,如下,写了一个方法让其它方法再需要强制一对多的数据时调用:

public void initializeGoodPics(Order order) {		order.getOrderGoodPics();	}

转载于:https://my.oschina.net/u/914897/blog/398263

你可能感兴趣的文章
MS SQL巡检系列——检查重复索引
查看>>
我的那些年(2)~我毕业了
查看>>
VS2017 配置ImageMagick
查看>>
scrapy 直接在编辑器运行
查看>>
微信小程序Tab选项卡切换大集合
查看>>
Hive任务优化--控制hive任务中的map数和reduce数
查看>>
[摄影]上海往事
查看>>
『原创』c#实现文件加密、解密及文件拖拽至程序图标直接打开
查看>>
POJ 2288 Islands and Bridges (状压DP)
查看>>
【Leetcode】Search in Rotated Sorted Array
查看>>
redis3.0.0 集群安装详细步骤
查看>>
WCF 之 初识WCF
查看>>
如何在Linux命令行中创建以及展示演示稿
查看>>
FutureTask——另一种闭锁的实现
查看>>
js-ES6学习笔记-Proxy
查看>>
Android和MVC
查看>>
Linux 用户和用户组管理
查看>>
RIP路由协议及工作原理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>