2016-06-23 12 views
0

In Employee and Phone exampleSpring Data JPA, Hibernate, @ManyToOne (Fetch = FetchType.LAZY) und org.hibernate.LazyInitializationException: konnte nicht initialisiert werden Proxy - keine Session

Wie Hibernate faule Initialisierung machen arbeiten (in 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; 

P. S. Einige rät, FetchType.EAGER wie in org.hibernate.LazyInitializationException: could not initialize proxy - no Session, zu verwenden, aber das Lazy-Laden zu machen (innerhalb Spring Boot, Spring Data JPA) ist genau mein Ziel.

+0

haben Sie current_session_context_class versucht -> Thread? – Apostolos

+0

Haben Sie repository.impl-Klassen? Sie können Daten von der JPA-Abfrage abrufen. –

+1

Erstellen Sie einen richtigen 'toString', der die Rückreferenz nicht enthält. Das Problem ist, dass Sie etwas protokollieren (ich schätze) ... Wieder potentiell gefährlich, als wenn es funktionieren würde, würden Sie wahrscheinlich auf eine Stack-Überlauf-Ausnahme stoßen, weil Pone auf "Employee" verweist, was wahrscheinlich wieder auf 'Phone' verweist und immer und immer wieder. –

Antwort

2

Danke an M. Deinum für Hinweis.

diesem speziellen Fall wurde durch Zugabe von toString() in Employee gelöst über toString() Lombok neu zu definieren

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

auch specifying exactly Fetch type

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

+0

Sie könnten auch Lombok verwenden und nur das 'employee' Feld von' Phone' explizit ausschließen, was den Trick machen sollte. –

0

Ich denke, Sie versuchen, die Kinder aus dem Proxy zu bekommen, wenn die aktuelle Sitzung gelöst ist, Sie können die faulen Kinder in der gleichen Sitzung bekommen.

+0

Wie Steuern von Sitzungen (das sind Hibernate-Dinge) von Spring Boot, das Spring Data-Repositorys über JPA verwendet? –

Verwandte Themen