Hibernate的Entit Manager数据值重复的问题

[b]问题描述:[/b]
当使用Hibernate的Anotation来定义一个复杂对象时,有可能需要关联别的表,当该对象与关联的表的关系为一对多,或多对多时,即 Entity的属性值为数组或者集合,且上面加有 @org.hibernate.annotations.CollectionOfElements @OneToMany或者@ManyToMany标签时,Hibernate会把该属性当做一个包来处理, 示例代码:
@OneToMany(mappedBy="parent",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<Child1> child1s = new LinkedList<Child1>(); @OneToMany(mappedBy="parent",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<Child2> child2s= new LinkedList<Child2>();

Hibernate在解析这个Entity的时候,可能会出现一些意外情况,有时会抛出“HibernateException: cannot simultaneously fetch multiple bags ”这样的异常,有时会出现数据项重复的情况,比方说,有如下的一个叫Parent的Entity, 它有2个属性Child1和Child2,数据库中的表结构如下:
[img]http://dl.iteye.com/upload/attachment/0081/5364/5360ac98-5181-3053-a891-571928dfba17.png[/img]
[img]http://dl.iteye.com/upload/attachment/0081/5366/c5af969b-5be3-3771-bda0-6bc988f839ba.png[/img]
[img]http://dl.iteye.com/upload/attachment/0081/5368/95112fb2-2b6a-33dc-aa8d-6798e35721e7.png[/img]
当Hibernate在解析ID为122 的Parent 的时候, 会首先把与该Entity相关的数据全部获取出来,形成如下的表结构:
[img]http://dl.iteye.com/upload/attachment/0081/5370/e490d613-2bd3-3332-91a6-d3c9d412cfe0.png[/img]

从上表中标红的字体,可以发现,虽然CHILD2表里面只有一行数据,但是却在数据中重复出现了2次,这就导致在child2s这个集合属性值里面有2条一模一样的数据。

[b]解决方法:[/b]
1、为属性值添加Anotation @IndexColumn(name="child2_id") 以指定属性值关联表的unique ID,当Hibernate解析该属性值,会先查看是否已经加载过相同的属性值,这样就避免了相同数据的重复加载。

2、把属性值的类型修改为Set这样,就当Hibernate把数据添加到属性值的时候就自动去重了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值