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共享呢?

相关文章
|
2月前
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
|
4天前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
9 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
7天前
|
Java 关系型数据库 MySQL
|
22天前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
60 11
|
26天前
|
Java Spring
Spring初始化加速的思路和方案问题之DAG分析在Spring并行初始化中面临哪些困难
Spring初始化加速的思路和方案问题之DAG分析在Spring并行初始化中面临哪些困难
|
2月前
|
NoSQL Java 应用服务中间件
蓝易云 - Spring redis使用报错Read timed out排查解决
以上都是可能的解决方案,具体的解决方案可能会因具体情况而异。
32 1
|
2月前
|
NoSQL Java 应用服务中间件
蓝易云 - Spring redis使用报错Read timed out排查解决
以上都是可能的解决方案,具体的解决方案可能会因具体情况而异。
22 2
|
2月前
|
SQL Java 数据库
Java一分钟之-Spring Data JPA:简化数据库访问
【6月更文挑战第10天】Spring Data JPA是Spring Data项目的一部分,简化了Java数据库访问。它基于JPA,提供Repository接口,使开发者能通过方法命名约定自动执行SQL,减少代码量。快速上手包括添加相关依赖,配置数据库连接,并定义实体与Repository接口。常见问题涉及主键生成策略、查询方法命名和事务管理。示例展示了分页查询的使用。掌握Spring Data JPA能提升开发效率和代码质量。
50 0
|
Java Spring Kotlin
第2讲 Kotlin + Spring Boot 集成 JPA 【Kotlin + Spring Boot 服务端开发课程系列】
【Kotlin + Spring Boot 服务端开发课程系列】第2讲 Kotlin + Spring Boot 集成 JPA 【视频教程】 投影片01.
1059 0
|
Java Spring 测试技术
Spring Boot集成JPA的Column注解命名字段无效的问题
偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名。
3950 0