gpt4 book ai didi

java - Hibernate + Lombok 的 Id 字段的 LazyInitializationException

转载 作者:行者123 更新时间:2023-12-01 19:54:11 24 4
gpt4 key购买 nike

当我将 Lombok 项目添加到我的 hibernate 项目中并在实体类上使用其 @Getter@Setter 时,我遇到了延迟初始化问题。实体类使用 Javax.persistence 的 @Entity 进行注释,因为我使用的是 hibernate 5。

问题堆栈跟踪:-

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:146)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:259)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
at com.capehenry.domain.user.User_$$_jvst52e_9.getId(User_$$_jvst52e_9.java)
at com.capehenry.business.rs.course.SeatRequestResource.validateSeatRequestCancel(SeatRequestResource.java:338)
at com.capehenry.business.rs.course.SeatRequestResource.cancel(SeatRequestResource.java:220)

使用下面的代码一切正常

@Entity
@Audited
@Table(name = "seat_request")
public class SeatRequest extends BaseEntity {

private CourseSchedule courseSchedule;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "courseScheduleId", nullable = false)
public CourseSchedule getCourseSchedule() {
return courseSchedule;
}

public void setCourseSchedule(CourseSchedule courseSchedule) {
this.courseSchedule = courseSchedule;
}

当我执行searRequest.getCourseSchedule().getId()时,它在休息层工作意味着在事务之外。

一旦我将代码更改为下面(添加lombok),休息层的searRequest.getCourseSchedule().getId()就开始抛出lazyInitializationException:-

@Entity
@Audited
@Table(name = "seat_request")
@Setter
public class SeatRequest extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "courseScheduleId", nullable = false)
private CourseSchedule courseSchedule;

注意:-1)我必须强制使用Lombok项目
2)我必须在Sevrice和trasaction之外使用searRequest.getCourseSchedule().getId()

请提出解决方案,提前致谢!!

最佳答案

I have to use searRequest.getCourseSchedule().getId() outside Service and transaction

我刚才注意到了这一点...如果您在服务和交易之外,您将始终遇到该异常。尝试使用FetchType.EAGER,它应该可以工作。

当您脱离事务时,您的实体将被分离,这意味着您标记为惰性的所有集合将不会被加载。因此,您有两个选择:第一个是在事务内执行对集合 getter 的所有调用,第二个是将集合标记为急切,因此当 Hibernate 加载实体时,它也会立即加载引用的集合。或者,您可以将您的实体映射到事务中的 DTO。只要您处于事务中,延迟加载字段的 getter 就始终有效,因此 DTO 的映射器将访问所有信息。一旦 DTO 退出事务,您将可以访问您已映射的所有字段,然后执行您想要的任何操作。

关于java - Hibernate + Lombok 的 Id 字段的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50128703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com