解决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

英文不好没有细看,但是可以看到在spring-boot项目中如何通过application设置hibernate的配置选项。

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

在spring.jap.properties后面可以接hibernate的各种配置,然后陪孩子会被自动注入的hibernate实例中。

然后再次运行单元测试全部通过,不在出现懒加载异常。

补充知识:Spring boot + hibernate 懒加载报错:could not initialize proxy - no Session

项目背景

旧项目改造成Spring boot 项目,使用了旧配置的方式引入了hibernate(非jpa)

问题描述

后台“对象.另一个对象”时报错:could not initialize proxy - no Session,出现了懒加载问题。

原因分析

出现该错误的原因是Hibernate使用sessionFactory来管理session,我们每进行一次数据库操作时都会新建一个session对象,当我们操作完成后,hibernate就会在dao层立即关闭该session。所以当我们操作类中另一个类的具体属性时,因为session已经关闭,就会报错。

解决方法

引入对应spring-orm的jar包,在spring boot 的启动类中添加这段代码:

@Bean
 public OpenSessionInViewFilter openSessionInViewFilter(){
  return new OpenSessionInViewFilter();
 }

注意:以上仅仅适合传统方法引入hibernate,如果你使用的是jpa,那么需要改为

@Bean
 public OpenEntityManagerInViewFilter openEntityManagerInViewFilter(){
 return new OpenEntityManagerInViewFilter();
 }

以上这篇解决spring boot hibernate 懒加载的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • 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,

  • 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传入Java对象创建动态表并录入数据

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

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

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

  • 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

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

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

  • 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;//备注

  • 解决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懒加载的4种方式

    本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式. 所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载. 例如,有一个对象是Employee,还有一个对象是Department.显然,对于Employee相对Depa

  • Hibernate懒加载之<class>标签上的lazy

    本文研究的主要是 lazy的概念:在真正使用某个对象的时候才去加载该对象. Hibernate的lazy策略可以使用在: 1.<class>标签上,可以取值:true/false. 2.<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改(这个没多大意义). 3.<set>和<list>标签上,可以取值:true/false/extra. 4.<many-to-one>和<one-to-one>

  • spring boot启动时加载外部配置文件的方法

    前言 相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.本文主要给大家介绍了关于spring boot启动时加载外部配置文件的相关内容,下面话不多说了,来随着小编一起学习学习吧. 业务需求: 加载外部配置文件,部署时更改比较方便. 先上代码: @SpringBootApplication public class Application { public static void main(String[] args) throws Exce

  • 解决JPA @OneToMany及懒加载无效的问题

    目录 JPA @OneToMany及懒加载无效 @OneToMany 小结一下吧 实现JPA的懒加载和无外键 例如 转换时使用 JPA @OneToMany及懒加载无效 @OneToOne @ManyToMany使用不做过多解释,重点解决"懒加载无效问题". 示例: @OneToMany teacher 和 student是一对多关系 只需要在studentList上使用@OneToMany注解,对应的参数为 懒加载.级联操作.子表外键 我为了验证懒加载是否生效,在debug模式下发现

  • 如何解决hibernate一对多注解懒加载失效问题

    目录 hibernate一对多注解懒加载失效 经排查,问题出在controller这边 解决方法 Hibernate懒加载异常说明及其解决 懒加载异常出现的原因 解决方案1 解决方案2 解决方案3 hibernate一对多注解懒加载失效 在House类里有关联HouseInfo,设置了懒加载 但是页面ajax返回还是有HouseInfos的数据. 经排查,问题出在controller这边 @response注解启用jackson框架对House进行解析 然后调用了每个属性的get方法,自然hou

  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hibernate的Session的生命周期变长,直到这个请求结束,具体是通过一个Filter来实现的. 那么,如果现在我们想用Hibernate懒加载特性,又想用延长session的生命周期,知道将数据提到页面显示(经过action层),那么我们就得在web.xml文件中增加以下配置: <!-- 配置

  • vue异步组件与组件懒加载问题(import不能导入变量字符串路径)

    目录 vue异步组件与组件懒加载 错误的原因分析 解决方案一 解决方案二 vue懒加载组件 路径不对 vue异步组件与组件懒加载 在写项目的时候,需要动态配置路由菜单,所有的菜单都是通过配置生成的,这就意味着菜单的路径(在vue开发项目里面就是一个字符串的路径)需要异步加载进去,但是由于对webpack的import不是很熟悉,所以就有一下的坑需要填了 错误的原因分析 _import.js module.exports = file => () => import(file) 但是这种方法错误

  • 解决spring懒加载以及@PostConstruct结合的坑

    目录 spring懒加载及@PostConstruct的坑 下面是一个初始化数据的组件 遗留问题 @PostConstruct注入不成功 直接先说原因吧 1.忽略ssm本身对注解是通过扫包才让注解有效的 2.忽略@Service的注解 3.注意扫包区间 4.@PostCoustruct注解用于 spring懒加载及@PostConstruct的坑 举例说明: 下面是一个初始化数据的组件 @Component public class InitData { /** * 初始化加载bean */ @

随机推荐