2016-06-23 38 views
0

Employee and Phone example春数据JPA,休眠,@ManyToOne(取= FetchType.LAZY)和org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

如何让Hibernate延迟初始化工作(在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 

Java code

public class Phone { 
    ... 
    @ManyToOne(fetch=FetchType.LAZY) 
    private Employee owner; 

附: 一些建议使用FetchType.EAGER类似于org.hibernate.LazyInitializationException: could not initialize proxy - no Session, ,但使延迟加载工作(在Spring Boot中,Spring Data JPA)正是我的目标。

+0

码你尝试过current_session_context_class - >话题? – Apostolos

+0

你有没有repository.impl类?您可以从JPA查询中获取数据。 –

+1

创建一个不包含反向引用的正确'toString'。问题是你正在记录一些东西(我猜)...再次潜在的危险,因为它会工作时,你可能会遇到一个堆栈溢出异常,因为Pone引用'员工'有'toString'可能再次引用'Phone'并再次获益。 –

回答

2

感谢M. Deinum的提示。

这种特殊的情况下 是通过添加EmployeetoString()解决在龙目岛toString()

@Override 
    public String toString() { 
     return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]"; 
    } 

重新定义也specifying exactly Fetch type

https://github.com/paulvi/spring-boot-querydsl

+0

你也可以使用Lombok,并明确地排除'Phone'中的'employee'字段,它应该做到这一点。 –

0

我想你是试图从当前会话分离的代理孩子, 你可以在同一会话中获得懒惰的孩子。

+0

如何从通过JPA使用Spring Data存储库的Spring Boot控制会话(即Hibernate的东西)? –

相关问题