文档章节

关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 528
阅读 16
收藏 0

关于这个问题在JPwH一书的13.2.3一节中做了详细的描述!

例子:ForumGroup和Forum

 

public class ForumGroup {
 @OneToMany(fetch=FetchType.EAGER,mappedBy="group")
 private List<Forum> forums = new ArrayList<Forum>();
}
public class Forum {
 @ManyToOne(fetch=FetchType.LAZY)
 @JoinColumn(name="groupId",nullable=false)
 @org.hibernate.annotations.ForeignKey(name="fk_Forum_groupId_ForumGroup")
 private ForumGroup group;
}

由于ForumGroup的forums被配制为eager fetch,也就是说在加载ForumGroup时,会同一并把它的所有Forum一起加载出来,这个过程是通过left out join来实现的。下面是hibernate打出的sql.

select
        this_.id as id3_1_,
        this_.creationTime as creation2_3_1_,
        this_.description as descript3_3_1_,
        this_.modifiedTime as modified4_3_1_,
        this_.name as name3_1_,
        forums2_.groupId as groupId3_,
        forums2_.id as id3_,
        forums2_.id as id2_0_,
        forums2_.creationTime as creation2_2_0_,
        forums2_.description as descript3_2_0_,
        forums2_.groupId as groupId2_0_,
        forums2_.modifiedTime as modified4_2_0_,
        forums2_.name as name2_0_
    from
        ForumGroup this_
   
left outer join
        Forum forums2_
            on this_.id=forums2_.groupId

假定有1个ForumGroup,它有3个Forum,上面的sql会生成3条记录。那么Hibernate是如何封装这3条数据的呢?从实际的代码运行结果中可以看到:首先,Hibernate确实只生成了一个ForumGroup的实例和3个Forum的实例。但是如果你使用loadAllForumGroup时,会返回3个ForumGroup的引用,指向同一个ForumGroup的实例!

如果把ForumGroup的forums被配制为lazy fetch,会解决这个问题。但这也只是回避了这个问题!

正确的解决方法是什么呢?

 如果想过滤join和fetch中的重复对象,有两种方法:

1.将续集里封装成set.比如:Set noDupes = new LinkedHashSet(resultList))

2.使用DISTINCT。比如:select distinct i from Item i join fetch i.bids

 

另外一个问题是:

在用JPA进行注释时,如果一个实体里要映射多个集合实体时,我们不能把两个集合的的FetchType设置为EAGER,此时只能设置为LAZY,否则会报:cannot simultaneously fetch multiple bags。或者我们也可以借助:@IndexColumn (加了它就不再是bag集合了,而是list集合了)。也就是说,hibernate不允许一次抓取多个bag.

本文转载自:http://blog.csdn.net/bluishglc/article/details/5559591

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
Hibernate性能优化3( 转)

作者:Robbin Fan 一。 inverse = ? inverse=false(default) 用于单向one-to-many关联 parent.getChildren().add(child) // insert child parent.getChildren().delete(child) // delete chi......

九爷
2011/05/14
0
0
Hibernate缓存与集合性能分析

Hibernate作为一个应用级的数据访问层封装,只能在其作用范围内保持cache中数据的有效性,如果系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。 Hibernate在本地JVM中维...

疯子船长
2015/10/26
0
0
hibernate中关于bag映射(转载)

Bag是一个java集合存储元素无需关心顺序,但允许列表中的重复元素。Bag是在列表中的对象的随机分组。 Collection集合被映射在该映射表中的<bag>元件和与java.util.ArrayList中初始化。 定义R...

李永china
2016/05/09
17
0
扼杀性能的 10 个常见 Hibernate 错误

医疗类app开发 ¥11000 微信二次开发 ¥3500 抽奖活动前端开发 ¥7000 官网UI设计 ¥4000 搜索匹配方案 ¥25000 艺术品交易网站开发 ¥80000 本文由码农网 – 小峰原创翻译,转载请看清文末的...

抽奖活动前端开发 ¥7000
2017/12/29
0
0
hql语句的语法

hql语句的语法 一、HQL查询的from子句 from是最简单的语句,也是最基本的HQL语句。from关键字后紧跟持久化类的类名。 例如: from Person 表明从Person持久化类中选出全部的实例 推荐为Perso...

风中帆
2016/08/23
30
0

没有更多内容

加载失败,请刷新页面

加载更多

slot分发内容

slot元素作为组件模板之中的内容分发插槽。这个元素自身将被替换。 有 name 特性的 slot 称为具名 slot。 有 slot 特性的内容将分发到名字相匹配的具名 slot。 内容分发就是指混合父组件的内...

Carbenson
11分钟前
1
0
python开发入门

1.执行python文件 # python ./demo.py 2.Python ImportError: No module named 'requests'异常 解决方法: # pip install requests;...

硅谷课堂
12分钟前
1
0
官宣,PyTorch 1.0 稳定版本现已推出

简评:快来一起快乐地学习吧。 随着 PyTorch 生态系统和社区继续为开发人员提供有趣的新项目和教育资源,今天(12 月 7日)在 NeurIPS 会议上发布了 PyTorch 1.0 稳定版。研究人员和工程师现...

极光推送
25分钟前
1
0
对比理解adr,ldr指令

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 参照韦老师的代码和Makefile写了test_adr.S: .text .globl _start _start...

天王盖地虎626
36分钟前
2
0
将spring boot 项目注册为Linux的服务

springboot 注册为Linux系统服务 springboot 注册为Linux系统服务

miaojiangmin
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部