记一次hibernate一对多问题的解决

本文探讨了在使用Hibernate与JSON进行数据交互时遇到的问题,包括如何避免因多对一关系引起的JSON解析死循环,以及解决由EAGER加载策略导致的数据重复问题。通过调整实体类关系映射,并采用LAZY加载策略配合手动加载一对多数据的方法,有效解决了上述问题。

最初的配置如下:

public class Order extends BaseEntity {
...
@OneToMany(cascade=CascadeType.ALL,mappedBy="order", fetch = FetchType.EAGER)
public Set<OrderGoodsPic> 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<OrderGoodsPic> 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值