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

先来看数据表

版块表只有两个数据

板块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=‘1‘

删除这个策略配置为

 @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=‘1‘

如果注解再改一下

 @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)配合急加载肯定不如搭配懒加载快

原文地址:https://www.cnblogs.com/jnhs/p/11404572.html

时间: 2024-08-29 12:20:33

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

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

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

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

目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关系的关联查询.前面文章中也介绍的nhibernate的查询:HQL,条件查询,原生SQL查询. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernat

hibernate 一对多 关系映射

在关系中,或多或少的表之间有复杂的关联关系 这里测试 一对多 关联关系的配置 开发步骤就不多说了.直接看一个示例. users 用户 和  shop商品订单表 分析:一个用户可以有多个商品订单,一个订单只属于一个用户. 这样就构成了一对多的关联关系. 这里用的是oracle 数据库 users 和 shop 数据库表 create table users( id number(7) primary key,   name nvarchar2(20),   pass nvarchar2(20),

Hibernate一对多关系操作

1.创建两个实体类. 一个实体类是商品类,另一个实体类是商品的分类类. 在一对多关系的两个实体中,在编写实体类时必须要遵循以下规则: (1)在一的那一方的实体中,必须要有一个私有的多那一方的实体对象属性,并且提供公有的getter和setter方法. private Integer gid; private String gname; private String gmessage; /** * 在一对多关系中,在一的这一方,必须要有一个多的对象的私有属性 * 别提供共有的getter和sett

hibernate一对多等情况关联查询效率低的解决方法

方法就是设置lazy=true 其实整个项目在接手时已经搭建好框架,数据库采用的是MySQL.客户运行了一年多时间,速度越来越慢.加上最近新开发的功能,速度已经不能让人接受. 先解决了MySQL远程访问速度问题,效果有了变化,但是依旧不能让人接受.后加功能都是自己亲手建的表,从数据库上杜绝了外键(个人不喜欢),没想到的是之前的表全是外键,而且有很多...设计不合理.废话不多说了,讲一讲改变后和之前的变化.之前页面加载10S,测试得分是0分,伤心的要死.改变之后是1s,得分88分.....好了不多

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

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

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

目录 写在前面 文档与系列文章 多对多关系关联查询 总结 写在前面 上篇文章介绍了nhibernate中对一对多关系进行关联查询的几种方式,以及在使用过程需要注意的问题.这篇文章对多对多关系的查询处理也采用上篇文章的描述方式进行说明. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate]O/R Mapping基础 [NHibernate]集合

NHibernate之旅(11):探索多对多关系及其关联查询

本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Order之间的"外键关系"或者称作"父子关系"."一对多关系"和关联查询,这一篇以Order为中心,分析Order和Product之间的关系,直接看下面一幅图的两张表: 上面两

[转]NHibernate之旅(11):探索多对多关系及其关联查询

本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Order之间的“外键关系”或者称作“父子关系”.“一对多关系”和关联查询,这一篇以Order为中心,分析Order和Product之间的关系,直接看下面一幅图的两张表: 上面两张表关系表达的意思是:Order有多个Produc