2016-06-23 2 views
0

В Employee and Phone exampleSpring Data JPA, Hibernate, @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; 

P.S. Некоторые рекомендуют использовать FetchType.EAGER, как в org.hibernate.LazyInitializationException: could not initialize proxy - no Session, , но выполнение Lazy загрузки (в Spring Spring, Spring Data JPA) является именно моей целью.

+0

вы пробовали current_session_context_class -> нить? – Apostolos

+0

У вас есть классы repository.impl? Вы можете получить данные из запроса JPA. –

+1

Создайте правильную 'toString', которая не включает обратную ссылку. Проблема в том, что вы регистрируете что-то (я думаю) ... Опять же, потенциально опасно, как при работе, вероятно, вы столкнулись бы с переполнением стека из-за того, что Pone ссылался на «Employee», у которого есть «toString», вероятно, ссылающийся на «Телефон» снова и получить и снова. –

ответ

2

Благодаря M. Deinum за подсказку.

Этот частный случай была решена путем добавления toString() в Employee повторно определить через Ломбок 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 и просто явно исключить поле 'employee' из' Phone', которое должно сделать трюк. –

0

Я думаю, что вы пытаетесь получить дочерние элементы из прокси-сервера, когда текущий сеанс отсоединен, вы можете получить ленивых детей в том же сеансе.

+0

Как управлять сеансами (это вещи Hibernate) из Spring Boot, которые используют хранилища Spring Data поверх JPA? –

Смежные вопросы