浅谈hibernate中懒加载禁用操作

浅谈hibernate中懒加载禁用操作

懒加载的概念:懒加载就是hibernate中的延迟加载,在hibernate中的一对多,多对多关系中通过对象导航来查询对象时一般默认的就是懒加载。就是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用该对象的属性是,才会向数据库中再一次发出查询语句。懒加载在某些情况下确实可以减少不必要的sql语句,但是有的情况下,还是会抛出异常。

下面我将介绍懒加载禁用的方式

方式一:

在需要禁用懒加载的实体对象的配置文件中配置lazy="false";

例如:

<many-to-one name="lkm_cust_id" lazy="false" column="lkm_cust_id" class="com.haha.domain.Customer"/>

方式二:

在service中强行加载这个代理对象,因为service层提交完事务之后,session就关闭了;所以要在session关闭之前把这个代理对象给加载了。

public Customer toedit(Customer customer) {
 Customer c= customerDao.toedit(customer);
 Hibernate.initialize(c);//强行加载
 return c;
 }

方式三:

注意:这种方法可以高效的解决我们的no-session问题

这个方法用于ssh整合时,其实它跟方式二的原因是一样的,但是解决的方式不同,这种方法是延长session的生命周期,让session在jsp页面加载完毕后在关闭。

这个过滤器不需要我们写,因为spring已经给我们提供了一个这样的过滤器类,我们只需配置就可以使用

在web.xml中配置

<!-- 解决no-session问题过滤器
 通过filter来让session在jsp页面完毕后再关闭session
 注意: 所有Filter的配置都需要放置在struts2入口过滤器配置之前
 -->
 <filter>
 <filter-name>openSessionInView</filter-name>
 <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>openSessionInView</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>

补充知识:hibernate中懒加载和急加载的区别?

1、fetch = FetchType.LAZY ----懒加载

在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存中。

2、fetch = FetchType.EAGER ----急加载

在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询。

在我们使用@ManyToOne等时,都会被默认为急加载。

以上这篇浅谈hibernate中懒加载禁用操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Hibernate双向多对多映射关系配置代码实例

    1.实体类 package com.yl.bean; import java.io.Serializable; import java.util.Set; /** * 商品实体类 */ public class Goods implements Serializable { private Integer id;//商品id private String goodsName;//商品名 private Double price;//商品价格 private String remark;//备注

  • springboot 2.3之后消失的hibernate-validator解决方法

    项目升级到springboot2.3之后,参数校验的注解报错,发现spring-boot-starter-web的依赖项已经去除了依赖 点开spring-boot-starter-web源码看了下. <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache

  • Hibernate双向一对一映射关系配置代码实例

    1.外键映射 1.1.实体类 package com.yl.bean; import java.io.Serializable; /** * 公民实体类 */ public class Person implements Serializable { private Integer id; private String name; private PersonCard card; public Person() { } public Person(Integer id, String name,

  • Spring+SpringMVC+Hibernate整合实例讲解

    使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns

  • Idea+maven搭建SSH(struts2+hibernate5+spring5)环境的方法步骤

    最近要使用 SSH 来编写期末的考核任务,之前也在网上查阅了很久,也试出了很多的问题.也很感谢很多前辈们的总结,我也查到了很多用用的内容. 本次项目,我将以一个简单的登录案例实现 SSH 的项目整合,项目我会放到 Github 上面,需要的同学可以 clone 下来在本地跑一跑 项目地址:SSH 脚手架 一.项目环境搭建 使用 maven 搭建一个 Java Web 项目 1.1 配置 Spring 坐标依赖 引入 Spring 坐标依赖 <!-- spring-context --> <

  • Hibernate基于ThreadLocal管理Session过程解析

    1.为什么要使用ThreadLocal管理Session session是线程不安全的,因此在多线程环境下,session对象不能为共享对象 把Session写成局部变量虽然可以解决线程安全问题,但是每次运行都要打开及关闭session对象,导致性能受影响 如果直接调用调用sessionfactory.openSession方法,则无法在业务层获取session对象 2.ThreadLocal管理Session的配置 2.1.方式一 通过自定义工具类实现 package com.yl.utils

  • Hibernate传入Java对象创建动态表并录入数据

    看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据 我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据 注意: 由于业务需要,这里对于字段的支持只有int和Integer,double和Double 还有String,同时对于String统一创建为了Varchar(100)的字

  • 解决spring boot hibernate 懒加载的问题

    spring boot 是快速构建微服务的新框架. 对于数据访问问题可以直接使用jpa技术,但是在单元测试发现spring jpa存在hibernate懒加载问题. 但是spring-boot没有xml配置文件所以现在网络上好多的解决方案并不能适用在spring boot框架中.在遇到该问题苦苦查询后终于无意中发现了解决方案. Spring application using JPA with Hibernate, lazy-loading issue in unit test 英文不好没有细看

  • 浅谈hibernate中懒加载禁用操作

    浅谈hibernate中懒加载禁用操作 懒加载的概念:懒加载就是hibernate中的延迟加载,在hibernate中的一对多,多对多关系中通过对象导航来查询对象时一般默认的就是懒加载.就是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的代理对象,当用户去使用该对象的属性是,才会向数据库中再一次发出查询语句.懒加载在某些情况下确实可以减少不必要的sql语句,但是有的情况下,还是会抛出异常. 下面我将介绍懒加载禁用的方式 方式一: 在需要禁用懒加载的实体对象的配置文件中配置lazy="f

  • 浅谈Angular2 模块懒加载的方法

    当项目变得复杂庞大以后,如果所有页面都在一个模块里,就会出现首页加载慢的问题,因为首页就已经把整个项目加载进来了.所以,很有必要根据业务将不同的功能分模块,以便Angular2按需加载,提升用户体验. 下面的例子是将首页放到home模块里,访问/home时加载home模块内容,仅供学习懒加载,其实首页访问路径应该是/ 先看项目文件结构: home模块放到src/app/home目录下,里面的home目录是home组件. home模块有单独的定义和路由(home.module.ts,home-ro

  • 浅谈vue首屏加载优化

    本文介绍了浅谈vue首屏加载优化,分享给大家,具体如下: 库使用情况 vue vue-router axios muse-ui material-icons vue-baidu-map 未优化前 首先我们在正常情况下build 优化 1. 按需加载 当前流行的UI框架如iview,muse-ui,Element UI都支持按需加载,只需稍微改动一下代码. 修改前: import MuseUI from 'muse-ui' import 'muse-ui/dist/muse-ui.css' imp

  • 浅谈SpringBoot2.4 配置文件加载机制大变化

    前言 Spring Boot 2.4.0.M2刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别.但是如果您的应用程序使用更复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因. 为什么要进行这些更改 随着最新版本 Spring Boot 发布,S

  • 浅谈JVM之类的加载链接和初始化

    加载 JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图. 从上面的图中,我们可以看到JVM中有三大部分,分别是类加载系统,运行时数据区域和Execution Engine. 加载就是根据特定名称查找类或者接口的二进制表示,并根据此二进制表示来创建类和接口的过程. 运行时常量池 我们知道JVM中有一个方法区的区域,在JDK8中,方法区的实现叫做元空间.这个元空间是存放在本地内存中的. 方法区中存放着每个class对应的运行时常量池. 当类或者接口创建

  • 浅谈Java类的加载,链接及初始化

    一 类生命周期 Loading Linking(Verification.Preparation.Resolution) Initializing 二 类加载器 1 图解 2 代码 package jvm; public class T002_ClassLoadLevel { public static void main(String[] args) { System.out.println(String.class.getClassLoader()); System.out.println(

  • 浅谈SpringBoot资源初始化加载的几种方式

    目录 一.问题 二.资源初始化 一.问题 在平时的业务模块开发过程中,难免会需要做一些全局的任务.缓存.线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢? 二.资源初始化 1.既然要做资源的初始化,那么就需要了解一下springboot启动过程(这里大体说下启动过程,详细:https://www.jb51.net/article/133648.htm) 按照前面的分析,Spring-boot容器启动流程总体可划分为2部分: 执行注解:扫描指定范围下的bean.载入自

  • 浅谈Hibernate中的三种数据状态(临时、持久、游离)

    1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 比如:刚刚使用new关键字创建出的对象. 2.持久态 存在于session中,事务还未提交,提交之后最终会进入数据库的数据,被称为持久态. 比如:刚刚使用session.save()操作的对象. 3.游离态(脱管态) 存在于数据库中,但不存在于session中的数据,被称为游离态. 比如:使用了session.save(),并且事务已经提交之后,对象进入数据库,就变成了游离态. 以上这篇浅谈Hibernat

  • 浅谈javascript中的加减时间

    上午在处理一些js中的日期参数的时候遇到了一点问题,不晓得如何加减时间. 最初的想法是自己分别取出year,month,day,hour,minute,second,然后手动加...开始想直接来个借位符就好了,后来一想,哪有那么容易. 最后,经过一个上午的摸索,终于搞定了. 首先是怎么显示一个标准的日期时间格式   "yyyy-mm-dd hh:MM:ss",暂时做法是先 var dtNow=new Date().//当前时间 标准的日期时间就拼出来,dtNow.getFullYear

  • 浅谈hibernate中对象的3种状态_瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object). • 瞬时态 由new命令开辟内存空间的java对象, eg. Person person = new Person("amigo", "女"); 如果没有变量对该对象进行引用,它将被java虚拟机回收. 瞬

随机推荐