[英]Spring Data JPA, Hibernate, @ManyToOne(fetch=FetchType.LAZY) and org.hibernate.LazyInitializationException: could not initialize proxy - no Session
In Employee and Phone example 在“ 员工和电话”示例中
How to make Hibernate Lazy initialization to work (within Spring Boot)? 如何使Hibernate Lazy初始化起作用(在Spring Boot中)?
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at com.example.domain.Employee_$$_jvstb7e_2.toString(Employee_$$_jvstb7e_2.java) ~[bin/:na]
at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_74]
at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_74]
at com.example.domain.Phone.toString(Phone.java:13) ~[bin/:na]
at com.example.SpringBootQuerydslTestBean$1.run(SpringBootQuerydslTestBean.java:49) ~[bin/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
... 6 common frames omitted
public class Phone {
...
@ManyToOne(fetch=FetchType.LAZY)
private Employee owner;
PS Some advises to use FetchType.EAGER
like in org.hibernate.LazyInitializationException: could not initialize proxy - no Session , but making Lazy loading work (within Spring Boot, Spring Data JPA) is exactly my goal. PS有些人建议像在org.hibernate.LazyInitializationException中那样使用
FetchType.EAGER
:无法初始化代理-没有Session ,但是使惰性加载工作(在Spring Boot,Spring Data JPA中)正是我的目标。
Thanks to M. Deinum for hint. 感谢Deinum先生的提示。
This particular case was solved by adding toString()
in Employee
to re-define over Lombok toString()
通过在
Employee
添加toString()
来重新定义Lombok toString()
,从而解决了这种特殊情况
@Override
public String toString() {
return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
also specifying exactly Fetch type 还要指定确切的提取类型
code at https://github.com/paulvi/spring-boot-querydsl https://github.com/paulvi/spring-boot-querydsl上的代码
This is happening because of the Lombok instruction @Data, instead of it, use @Getter and @Setter, Follow javadocs from @Data: 这是由于Lombok指令@Data而不是使用@Getter和@Setter引起的,请遵循@Data中的javadocs:
Equivalent to @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
等效于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode。
The instruction @ToString generate a implementation of toString method for entire class, so in your JPA return needs to have data for all the object. @ToString指令为整个类生成toString方法的实现,因此在JPA返回中需要所有对象的数据。
我认为您正在尝试在当前会话分离时从代理获取子项,可以在同一会话中获取懒惰的子项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.