先来看数据表

版块表只有两个数据

板块1是推荐,下边没有子栏目

板块2下边有14个子栏目

在1的一端来查询,发现结果有16条

也就是板块1+版块2+版块2和他的14个子集都列出来了,这明显不对

板块对象的配置

    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联

猜测了一下,是急加载导致的

查需语句为

Hibernate:
select
this_.id as id1_17_1_,
。。。。from
t_section this_
left outer join
t_column columnmode2_
on this_.id=columnmode2_.sectionId
Hibernate:
select
columnmode0_.id as id1_7_,
。。。。from
t_column columnmode0_
where
columnmode0_.sectionid=''

删除这个策略配置为

 @OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联

或者使用懒加载

 @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联

可以解决这个数据集重复的问题

但是,这样又获取不到多方的集合

看起来问题并不能这样解决

经过查询得知,使用 @Fetch可以解决这个问题

 @OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联
@Fetch(FetchMode.SUBSELECT)

在控制台得知,发出的是两条查询

Hibernate:
select
this_.id as id1_17_0_,
。。。。。from
t_section this_
Hibernate:
select
columnmode0_.id as id1_7_,
。。。。from
t_column columnmode0_
where
columnmode0_.sectionid=''

如果注解再改一下

 @OneToMany(cascade = {CascadeType.ALL},fetch = FetchType.EAGER)
@JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联
@Fetch(FetchMode.SUBSELECT)

语句又变了

Hibernate:
select
this_.id as id1_17_0_,
。。。。from
t_section this_
Hibernate:
select
columnmode0_.sectionId as sectionI7_17_1_,
。。。。from
t_column columnmode0_
where
columnmode0_.sectionId in (
select
this_.id
from
t_section this_
)

至于查询效率问题,目前暂无时间处理,有时间再用分析器测试,不过从语句上来分析,@Fetch(FetchMode.SUBSELECT)配合急加载肯定不如搭配懒加载快

hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决的更多相关文章

  1. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  2. Hibernate一对多关系操作

    1.创建两个实体类. 一个实体类是商品类,另一个实体类是商品的分类类. 在一对多关系的两个实体中,在编写实体类时必须要遵循以下规则: (1)在一的那一方的实体中,必须要有一个私有的多那一方的实体对象属 ...

  3. 11.Hibernate一对多关系

    创建JavaBean 一方: Customer private long cust_id; private String cust_name; private long cust_user_id; p ...

  4. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  5. hibernate一对多关系配置

    一.     表信息 公司表 cId cName cAdress Null Null Null 表t_company 员工表 sId sName sAge cId Null Null Null Nul ...

  6. hibernate 一对多关系中的孤儿属性

    @OneToMany(targetEntity = BenefitType.class, mappedBy = "sitePerson",cascade = CascadeType ...

  7. mybatis一对多关系的关联查询

    问题描述:实现两张表的关联查询 学生表: 班级表: 要实现学生管理信息中有所在班级的名称,即如下图所示 1.对应学生表的pojo类写全班级表中的字段(适用于要连接的表字段较少的情况) sql语句直接在 ...

  8. hibernate一对多关系映射(自身关联)

    示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别. public class Category  { private Integer id; private String ...

  9. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

随机推荐

  1. Mybatis笔记 – 入门程序开发

    一.Mybatis开发环境 JDK:jdk_1.7 Eclipse:Oxygen.1 Release (4.7.1) MySQL:MySQL Servr 5.7 1.添加相关ja r包 mybatis ...

  2. 17.splash_case03

    # python执行lua脚本 import requests from urllib.parse import quote lua = ''' function main(splash) retur ...

  3. 使用CEfSharp之旅(1) 加载网络页面

    原文:使用CEfSharp之旅(1) 加载网络页面 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://blog.csdn ...

  4. webpack 简单笔记(二)CommonsChunkPlugin插件

    接下来就要使用CommonsChunkPlugin插件 (一)单一入口,模块单一引用,分文件输出,单一入口,模块重复引用,分文件输 main.js代码 require('./static/js/mai ...

  5. webservice、httpClient、dubbo的区别

    在开发中,对于同一个war包中的对象方法我们可以直接调用,但是很多情况下需要在不同项目或者不同服务器进行相互调用 webservice webservice技术可以实现不同服务器项目直接的调用和交换数 ...

  6. 【期望DP】[UVA1498] Activation

    显然是概率DP 我们用dp[i][j]表示队伍中有i个人,lyk的小迷妹现在排在j这个位置时的概率大小 不难列出下列转移方程: (显然已经排到前面k个位置的时候是要加上爆炸也就是p4的概率的) $$f ...

  7. html--图片背景兼容,兼容IE6

    在IE6中对图片格式png24支持度不高, 如果使用的图片格式是png24,则会导致透明效果无法正常显示 解决方法: 1.可以使用png8来代替png24,即可解决问题, 但是使用png8代替png2 ...

  8. 线性dp——求01串最大连续个数不超过k的方案数,cf1027E 好题!

    只写了和dp有关的..博客 https://www.cnblogs.com/huyufeifei/p/10351068.html 关于状态的继承和转移 这题的状态转移要分开两步来做: 1.继承之前状态 ...

  9. ssoj 2279 磁力阵

    说不想改最后还是向T1屈服了..然后就de了一下午Bug... 虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了. 说自己的做法,略鬼畜. 每个正方形的边界上的边.每条边在 ...

  10. javascript 数组的方法(一)

    栈方法(后进先出) ArrayObj.push():就是向数组末尾添加新的元素,返回的是数组新的长度. ArrayObj.pop():就是向数组中删除数组最后一个元素并且返回该元素.如果数组为空就返回 ...