Spring Data Jpa懒加载报错分析

简介: Spring Data Jpa懒加载报错分析

1 Jpa懒加载报错

Caused by: org.apache.tapestry5.runtime.ComponentEventException: could not initialize proxy - no Session

2 报错分析

异常很明确,没有session,那没有session和我们的懒加载和立即加载有什么联系呢?我想大部分的小伙伴都遇到过这个问题,也都能说出答案。

  1. 立即加载,他是无论用不用到关联实体,都会将关联实体查出来,这个挺简单的,也不会引发啥异常,但是性能就有点可悲了,因为他啥都能查出来,就像for循环一样,如果不考虑性能,基本没有for循环搞定不了的事。

     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "tradeRuleId", referencedColumnName = "id", insertable = false, updatable = false)
     private TradeRule tradeRule;
  2. 懒加载,首先懒加载是在查询数据时不会将关联实体直接查出来,而是用的时候查出来。

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "sailingScheduleId", referencedColumnName = "id", insertable = false, updatable = false)
    private Set<Dynamic> dynamics;

    如果我使用了懒加载,然后我又要从懒加载的实体上获得其内部属性这会产生什么后果。这就是上面的结果,抛出了异常

    Caused by: org.apache.tapestry5.runtime.ComponentEventException: could not initialize proxy - no Session

    那为什么是没有session呢,那是因为懒加载必须要有session连接才能获得数据,如果session没有,那就回报错,这下应该很明了了。在使用查询的时候,会获取数据库的连接session,查询后session关闭,但是懒加载的属性并没有在查询的时候查出来,所以读取他的时候就会报错,因为session已经关闭了。

    那为什么立即加载就没问题,因为立即加载是查询一次之后,框架会把数据存储在内存中,所以立即加载就不用考虑了。

    那又有一个问题,什么叫懒加载在用的时候会去查询?这个问题,我是很疑惑的,后来得到了一个解答。

    List<Node> nodeList = ApplicationContextUtil.instance.getJpaUtil().list(                "select u.nodeSet from simm.spring.entity.ProcessBlock u where u.id=1", null, Node.class);
    

    以上就是用的时候去查询,也就是针对这个懒加载的实体单独的一个查询。

3 Session

这里面说的是数据库的session,下面说一说的他的运用

比如 Mybatics 的SqlSessionFactory都是拿到session才能去查数据,通透点说就是要登录数据库系统才行,我看网上有的说在service层session是共享的,搞得我去session层去取懒加载的数据,结果还是报错,回头想想这种说法就是错误的,每次查询都说开启一个session然后session在查询后会断开。谈什么service层数据库session共享呢?

相关文章
|
1月前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
57 14
|
3月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
49 9
|
3月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
748 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
3月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
278 2
|
3月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
69 0
Springboot引入jpa来管理数据库
|
4月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
204 5
|
4月前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
100 4
|
4月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
156 2
|
3月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
77 0
|
2天前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
24 10
下一篇
开通oss服务