使用HIBERNATE的注解@ManyToOne(fetch = FetchType.lazy) 时候,报出错误
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at com.evolution.warlock.entity.Department_$$_javassist_1.getName(Department_$$_javassist_1.java)
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:180)
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:267)
at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)
找了下答案,主要是因为:
fetch=FetchType.LAZY就等于打开了延迟加载,Hibernate中的get方法不论是否开启延迟加载都会一次加载所有基本数据类型属性的值,而load则不同,开启延迟加载后load(id),返回的对象会被Hibernate加一个壳(持久化上下文中没有缓存该对象的前提下),拦截所有非id属性的访问操作(getter,setter调用),只有id属性中有实际值(其实就是你调用load方法时传的那个),在session没有关闭的之前,如果访问除id外的其他属性才会发sql语句去查询,你这个错误就是因为在当前session关闭以后访问由load()加载的对象的非id属性,此时Hibernate尝试通过当前session发sql查询,但发现session已经关闭,这样才会报错。
我测试发现的确是上面所说的,LAZY阻挡了除ID以外的所有访问,所以解决的办法就很多,
一.就是只拿ID,再从数据库从新拿一次你需要的东西。
二.将FetchType.lazy 改成 EAGER
三.配置xml (没试过)
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四.在service层使用Hibernate.initialize()将你需要的对象从新持久化
五.在MVC里面配置,个人觉得这个办法更好
分享到:
相关推荐
而对于"多"端的实体,我们需要在对应的属性上使用`@ManyToOne`注解,并通过`@JoinColumn`指定外键列名。例如: ```java @Entity public class Department { @Id private Long id; // 其他属性和方法 } @Entity ...
本文将深入探讨Hibernate中的两个关键概念——注解声明的一对多(@OneToMany)和多对一(@ManyToOne)关系,以及如何在实际项目中应用它们。 一、Hibernate注解介绍 Hibernate通过注解简化了Java类与数据库表之间的...
总结来说,Hibernate的Many-to-One关联映射是通过注解实现的,它简化了数据库操作,使我们能更专注于业务逻辑。在实际开发中,理解并熟练运用这种关联方式,能够提高代码的可读性和可维护性。在后续的学习中,你还...
9. **注意事项**:可能还会提及一些最佳实践,如懒加载(@ManyToOne fetch=LAZY)以避免N+1查询问题,或者是在处理关联时的性能优化策略。 以上就是Spring Boot与Spring Data JPA处理多对一关系的基础知识,通过...
最后,我们可以创建Device实体类,并使用@ManyToOne注解来关联Build实体类。 ```java @XmlRootElement @Entity @Table(name = "device") public class Device { @Id @GeneratedValue(strategy = GenerationType....
本篇将深入探讨Hibernate的四种主要关联关系:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),并结合实例来阐述每种关系的配置和使用。 1. **一对一关联(OneToOne)** 一...
9.懒加载和立即加载:@LazyCollection(LazyCollectionOption.EXTRA)和@OneToMany(fetch = FetchType.EAGER)分别代表懒加载和立即加载策略,控制关联对象何时从数据库加载。 10. @OrderColumn:用于有序集合,如List...
在Java世界中,JPA(Java Persistence ...在处理这类关系时,我们需要注意外键的设置、关联的加载策略以及如何在实际操作中高效地查询和使用这些关联数据。理解和熟练运用这些知识对于开发复杂的Java应用程序至关重要。
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将深入探讨如何在Hibernate中使用注解来实现实体类的配置,特别是...
使用`@OneToMany`注解标记在父类(多的一方),并使用`@ManyToOne`注解标记在子类(单的一方)。同时,需要设置`mappedBy`属性来指定外键所在的实体字段。 ```java @Entity public class Student { @Id private ...
好的日志记录策略可以帮助开发者快速定位和解决问题。 知识点八:Java集合框架的使用 在处理业务逻辑时,Java集合框架的使用非常频繁。文档中提到了使用HashSet来存储实体对象,这展示了如何通过迭代器遍历表单集合...
session in view**:在Spring Boot中,如果使用Hibernate作为JPA的实现,需要在配置文件(application.properties或application.yml)中开启Open Session In View(OSIV)过滤器,以解决懒加载在HTTP请求结束后引发...
3. **加载策略:** `@ManyToOne`默认使用立即加载,`@OneToMany`默认使用懒加载。 **示例代码:** ```java @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "parent_id") private ParentEntity parent; @...
默认情况下,`@ManyToOne`关系使用懒加载策略,只有在访问`class`属性时才会去数据库加载相关数据。如果希望在加载`Student`时同时加载`Class`,可以设置`fetch=FetchType.EAGER`。 综上所述,Hibernate的单向多对...
在一对多关联映射中,我们通常会在两个实体类上使用`@OneToMany`和`@ManyToOne`注解。假设我们有一个`User`类和一个`Order`类,用户可以有多个订单,而每个订单则属于一个特定的用户。在`User`类中,我们会这样定义...
使用`@ManyToOne`注解,并通过`@JoinColumn`指定外键字段。 四、多对多(ManyToMany)关联 多对多关联表示两个实体之间存在多个交叉关联。通常需要一个中间表来存储两个实体的联合主键。配置时使用`@ManyToMany`,...
Hibernate 是一个流行的对象关系映射(ORM)...正确配置映射关系能够提升应用程序的性能和可维护性,避免出现不必要的 N+1 查询问题,并简化数据库交互的复杂性。在实际开发中,应根据业务需求灵活选择合适的映射方式。