【发布时间】:2018-05-02 06:52:49
【问题描述】:
当我将 Lombok 项目添加到我的休眠项目中并在实体类上使用它的 @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()
请提出解决方案,在此先感谢!
【问题讨论】:
-
那么为什么不直接获取 ID 呢?对于您不一定总是需要的东西,延迟获取通常是一个很好的策略,ID 字段非常重要,可以急切地获取。
标签: java spring hibernate lombok lazy-initialization