SpringDataJPA(16)多表查询:对象导航查询_spring data jpa 多表查询-程序员宅基地

技术标签: spring  spring boot  # JPA  java  

1.概述

对象导航查询:查询一个对象的同时,通过此对象聋询他的关联对象

在这里,将使用一对多里面所使用的配置进行示例

2. 测试对象查询

2.1 从一方查询多方

默认使用延迟加载

2.1.1 测试

测试类:

package cn.yy.test;

import cn.yy.dao.ManyCustomerDao;
import cn.yy.dao.ManyLinkManDao;
import cn.yy.domain.Customer;
import cn.yy.domain.LinkMan;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import java.util.Set;

/**
 * @author Marston
 * @date 2021/12/5
 */
@RunWith(SpringJUnit4ClassRunner.class)//声明spring提供的单元测试环境
@ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息
public class OneToManyTestQuery {
    
    @Autowired
    private ManyCustomerDao manyCustomerDao;
    @Autowired
    private ManyLinkManDao manyLinkManDao;

    /**
     * 测试对象导航查询(查询一个对象的时候,通过此对象查询所有的关联对象)
     */
    @Test
    @Transactional//解决java代码中报错:could not initialize proxy - no Session
    public void testQuery1(){
    
        //查询id为1的客户
        Customer customer = manyCustomerDao.getOne(1l);
        //对象导航查询,此客户下的所有联系人
        Set<LinkMan> linkMans = customer.getLinkMans();
        for (LinkMan linkMan:linkMans){
    
            System.out.println(linkMan);
        }
    }

}

运行结果:

cs_linkman数据库表内容:
在这里插入图片描述
cst_customer数据库表中的数据
在这里插入图片描述
运行结果:
在这里插入图片描述

2.1.1 延迟加载

默认使用的是延迟加载,如果想要修改加载方式的话,想要修改实体类中的注释,在本例中,想要修改加载方式的话就需要对实体类Customer中对注释进行修改

/*
        放弃外键维护权:
            mappedBy:对方配置关系的属性名称
        cascade :配置级联( 可以配置到设置多表的映射关系的注解上)
                CascadeType.all:所有
                            MERGE:更新
                            PERSIST:保存
                            REMOVE:删除
         fetch :配置关联对象的加载方式
                EAGER   :  立即加载
                LAZY    :   延迟加载
     */
    @OneToMany(mappedBy =  "customer" ,cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<LinkMan> linkMans = new HashSet<LinkMan>();

测试方法,该方法在2中的测试类中

/**
     * 对象导航查询:
     *      默认使用的是延迟加载的形式查询的
     *          调用get方法并不会立即发送查询,而是在使用关联对象的时候才会查询,这叫做延迟加载!
     *
     *      修改配置,将延迟加载改为立即加载
     *          fetch,需要配置到多表映射关系的注解上面
     */
    @Test
    @Transactional//解决java代码中报错:could not initialize proxy - no Session
    public void testQuery2(){
    
        //查询id为1的客户
        //之前的情况下getOne默认使用延迟加载的方式,findOne是使用立即加载的方式进行查询
        //但是在对象查询中,默认使用的都是延迟加载方式
        Customer customer = manyCustomerDao.findOne(1l);
        //对象导航查询,此客户下的所有联系人
        Set<LinkMan> linkMans = customer.getLinkMans();//默认是延迟加载,调用
        System.out.println(linkMans);
        for (LinkMan linkMan:linkMans){
    
            System.out.println(linkMan);
        }
    }

运行结果:

2.2 从多一方查询一的一方

默认使用立即加载

2.2.1 测试

测试方法,该方法在2中的测试类中

/**
     * 从联系人对象导航查询他的所属客户
     *      从多的一方去查询少的一方:默认使用立即加载
     *      使用配置修改需要找到查询主体:在这里是联系人,与之前的fetch使用方法一样,修改其属性便可以修改加载方式
     */
    @Test
    @Transactional//解决java代码中报错:could not initialize proxy - no Session
    public void testQuery3(){
    
        //查询id为1的客户
        LinkMan linkMan = manyLinkManDao.findOne(2l);
        //对象导航查询所属用户
        Customer customer = linkMan.getCustomer();
        System.out.println(customer);
    }

3. 总结

对于对象导航查询来说:

从一方查询多方

  1. 默认:使用延迟加载
  2. 关联对象是一个集合,集合便说明里面可能有许多数据,如果不需要使用所有的数据,就会照成极大的浪费效率,所以需要使用延迟加载

从多方查询一方

  1. 默认:使用立即加载
  2. 只是需要查询一个数据,所以使用立即加载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yyuggjggg/article/details/121774456

智能推荐

鸿蒙下个模式是什么,鸿蒙2.0是什么系统_ 鸿蒙2.0到底是什么-程序员宅基地

文章浏览阅读310次。鸿蒙2.0系统现在是比较的火的,那么这个系统它怎么样呢?鸿蒙2.0这款系统是来自哪家品牌呢?相信很多小伙伴会有这样的疑问吧。那么我们就一起来了解一下吧。1.鸿蒙2.0系统是什么官方介绍“鸿蒙系统(HongmengOS)是一款“面向未来”的操作系统,一款基于微内核的面向全场景的分布式操作系统,现已适配智慧屏,未来它将适配手机、平板、电脑、智能汽车、可穿戴设备等多终端设备“。可以看到这是一场大的布局,..._什么是鸿蒙2.0

最易懂的数据库异地多活方案-程序员宅基地

文章浏览阅读293次。Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者:莫那·鲁道来源:http://thinkinjava.cn/前言随着业务发展越来越快,数据量越来越多,用户也越来..._异地存活java

Android 应用集成友盟统计_apk文件中友盟appkey-程序员宅基地

文章浏览阅读896次,点赞3次,收藏4次。一、根据友盟官网的介绍引入依赖dependencies { implementation fileTree(include:['*.jar'], dir:'libs') // 下面各SDK根据宿主App是否使用相关业务按需引入。 // 友盟统计SDK implementation 'com.umeng.umsdk:common:9.4.7'// 必选 implementation 'com.umeng.umsdk:asms:1.4.1'// 必选 _apk文件中友盟appkey

Pytorch手撸交叉熵CrossEntropyLoss并修改one-hot输入_torch cross_entropy onehot-程序员宅基地

文章浏览阅读4.2k次,点赞17次,收藏37次。目录1 前言2 交叉熵的实现过程3完整的自定义交叉熵4.使用自己one-hot的交叉熵1 前言楼主最近要修改一下one-hot然后送入交叉熵中,由于pytorch的torch.nn.CrossEntropyLoss()已经封装好了one-hot,所以需要自定义重写交叉熵,这里主要是多级交叉熵,而不是二分类交叉熵。2 交叉熵的实现过程首先看多级交叉熵的计算过程:L=−1N∑iN∑c=1Myiclog(pic)L = -\frac{1}{N}\displaystyle\sum_i^N\display_torch cross_entropy onehot

Android 8.0后台执行限制_android 后台数据 多长时间生效-程序员宅基地

文章浏览阅读890次。Android O对应用在后台运行时可以执行的操作施加了限制,称为后台执行限制(Background Execution Limits),这可以大大减少应用的内存使用和耗电量,提高用户体验。后台执行限制分为两个部分:后台服务限制(Background Service Limitations)、广播限制(BroadcastLimitations)。后台服务限制如何才算是后台应用?除了下面情况外都是后..._android 后台数据 多长时间生效

R语言广义线性模型_lrm在r代码-程序员宅基地

文章浏览阅读9.6k次。转载自:http://blog.csdn.net/lilanfeng1991/article/details/361857391.广义线性模型和glm()函数广义线性模型扩展了线性模型的框架,它包含了非正态因变量的分析。广义线性模型通过拟合响应变量的条件均值的一个函数(不是响应变量的条件均值),假设响应变量服从指数分布族中的某个分布(并不仅限于正态分布),极大地扩展了标_lrm在r代码

随便推点

Cordova 插件合集_cordova-plugin合集_cordova-plugin-magnetometer-程序员宅基地

文章浏览阅读5.5k次。1.0cordova-plugin-contacts 联系人,新增,联系人,拨打电话cordova plugin add cordova-plugin-contacts详细:cordova-plugin-contacts联系人操作_天马3798的博客-程序员宅基地_cordova 联系人1.cordova-plugin-themeablebrowsercordova plugin add cordova-plugin-themeablebrowser详细使用:cordova-p..._cordova-plugin-magnetometer

开源的Java反编译工具JD-GUI_jd-gui官网-程序员宅基地

文章浏览阅读1.1k次。JD-GUI 是一款开源的 Java 反编译工具,支持Windows和苹果Mac OS。以反编译和分析Java 5“字节码”及更高版本,它显示“ .class”文件的Java源代码。可以使用JD-GUI浏览重建的源代码,以立即访问方法和字段。 JD-Eclipse是Eclipse平台的插件。它允许您在调试过程中显示所有Java源代码,即使您没有全部源代码也是如此。..._jd-gui官网

android ota升级包屏蔽时间戳比较_android ota 升级不对比时间戳-程序员宅基地

文章浏览阅读1.2k次。Android的OTA升级包中,里面有一个升级脚本,该脚本会检测recovey镜像的编译时间和OTA包的编译时间,如果recovey比OTA包的时间要新的话,升级便会失败。方法一:直接屏蔽比较函数,到build/tools/releasetools/ota_from_target_files这个脚本,注释掉函数 script.AssertOlderBuild(ts, ts_text)调用,这样编译..._android ota 升级不对比时间戳

QT图片转Base64数据 与 Base64转图片_qt base64转图片-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏22次。图片转Base64数据 m_imagePath = QFileDialog::getOpenFileName(this, tr("select image"), "./pic/", tr("Image Files(*.jpeg *.jpg *.png *.bmp *.pgm *.pbm);;All(*.*)")); //选择图片 ui->imageDataPath->setText(m_qt base64转图片

MySQL存储函数之如何用in查询_mysql中的in查询-程序员宅基地

文章浏览阅读1k次。MySQL 存储过程_mysql中的in查询

安装Ubuntu后无法启动_ubuntu安装后无法启动-程序员宅基地

文章浏览阅读7.4k次。安装完Ubuntu20.04后,重启,只有一个下划线在左上角闪烁。或者有一个grub引导命令。_ubuntu安装后无法启动

推荐文章

热门文章

相关标签