Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException‘ exceptio

本文主要是介绍Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException‘ exceptio,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException’ exception.如何解决?????

使用hibernate从一方获取多方信息的时候发生
这个异常与hibernate加载关联对象的2种方式有关,一个是懒加载方式,一个是立即加载方式.

在这里插入图片描述

方案

步骤1、

一个颗粒会有多个选项
一个颗粒聚合多个选项的时候加上注解
在这里插入图片描述

 @OneToMany(mappedBy = "contentGrain", cascade = CascadeType.ALL,fetch = FetchType.EAGER, orphanRemoval = true)private List<Option> option ;@Entityprivate static class Option {public Option(){};
}

@OneToMany: 表示一个实体类的一个属性与另一个实体类的多个实例关联。
mappedBy = “contentGrain”: 指定了另一个实体类中与当前属性关联的属性名,也就是当前实体类所拥有的外键属性的名称。这里的 “contentGrain” 是另一个实体类中的属性名。
cascade = CascadeType.ALL: 表示级联操作,当对当前实体类进行增删改操作时,会同时对关联的另一个实体类进行相应的操作,例如删除当前实体类的同时,也会删除关联的另一个实体类。
fetch = FetchType.EAGER: 表示在加载当前实体类时,同时也会加载关联的另一个实体类。(没有写这个是造成没有及时加载的原因)
orphanRemoval = true: 表示如果另一个实体类与当前实体类的关系断开,另一个实体类是否应该自动删除。如果设置为 true,表示应该自动删除;如果设置为 false,表示不应该自动删除。

步骤2:

多的中的外键(对应的是颗粒主键)上的注解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

     // 外键,指向外部类@ManyToOne
//        @JoinColumn(name = "outer_id")@JoinColumn(name = "outer_id",referencedColumnName = "id")private ContentGrain contentGrain;

总结

乱用注解者亡

"org.hibernate.LazyInitializationException"异常通常发生在使用Hibernate的延迟加载(Lazy Loading)时,当在Session关闭后或者没有事务上下文的情况下,尝试访问未加载的延迟加载属性时会抛出此异常。

为了解决这个问题,有几种常见的方法:

启用延迟加载(Eager Loading):在查询数据库时,使用Hibernate的"fetch"或"join fetch"来立即加载关联的实体。这样可以避免延迟加载,将相关数据一起查询出来,避免在Session关闭后访问未加载的属性。但要注意,使用Eager Loading可能会导致性能问题,因为它会一次性加载所有相关数据。

在事务范围内加载属性:如果你确保在访问延迟加载属性时仍然在Hibernate的事务范围内,你可以通过打开事务或延长事务的生命周期来解决这个问题。确保延迟加载属性的访问发生在事务内部。

使用OpenSessionInView模式:在Web应用中,可以使用OpenSessionInView模式来延长Session的生命周期,从而避免LazyInitializationException异常。这种模式允许Session在整个请求周期内保持打开状态,直到请求处理完成。但要注意,这种方法也可能带来一些潜在的性能问题,应谨慎使用。

使用FetchType.SUBSELECT:在实体类的关联属性上,可以设置FetchType为SUBSELECT。这将使用子查询(Subselect)方式加载所有延迟加载的关联实体,从而避免在Session关闭后访问未加载的属性。

@Entity
public class ParentEntity {// other fields and annotations@OneToMany(fetch = FetchType.LAZY)@Fetch(FetchMode.SUBSELECT)private List<ChildEntity> children;// getters and setters
}

使用DTO(Data Transfer Object):在某些情况下,你可以考虑使用DTO来封装需要的数据,而不是直接使用Hibernate实体类。这样可以避免延迟加载问题,因为DTO对象不会受到Hibernate延迟加载的影响。
总的来说,解决"org.hibernate.LazyInitializationException"异常的方法取决于具体的业务需求和使用场景。在选择解决方案时,要考虑性能和代码质量,并根据具体情况做出适当的调整。

这篇关于Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException‘ exceptio的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/287436

相关文章

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

Unable to instantiate Action, goodsTypeAction, defined for 'goodsType_findAdvanced' in namespace '/

报错: Unable to instantiate Action, goodsTypeAction,  defined for 'goodsType_findAdvanced' in namespace '/'goodsTypeAction......... Caused by: java.lang.ClassNotFoundException: goodsTypeAction.......

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

Hibernate中自带的连接池!!!

<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;"><?xml version="1.0" encoding="UTF-8"?></span> <span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC"-//Hibern