2015-02-20 4 views
2

У меня есть контроллер пружины, который вызывает сервисный уровень, и он вызывает слой Fao.Почему диспетчер объектов возвращает мне объект с нулевыми значениями?

1) Я получаю объект User, используя метод find() EntityManager. Он извлекает данные очень хорошо.

2) У каждого пользователя есть одно отношение к объекту школы.

@ManyToOne(fetch = FetchType.LAZY, optional=false) 
    @JoinColumn(name="SCHOOL_ID", foreignKey = @ForeignKey(name = "FK_USER_SHCOOL")) 
    private School school; 

3) когда я получаю школу от объекта сущности пользователя, hibernate регистрирует мне SQL-запрос.

select school0_.id as id1_7_0_, school0_.ADDRESS as ADDRESS2_7_0_, school0_.CITY as CITY3_7_0_, 
school0_.DESCRIPTION as DESCRIPT4_7_0_, school0_.EMAIL as EMAIL5_7_0_, school0_.NAME as NAME6_7_0_, 
school0_.version as version7_7_0_ from SCHOOL school0_ where school0_.id=2 

Когда я запускаю этот запрос в SQL-клиенте, я получаю reall и исправляю данные!

4) НО когда я школа от пользователя entyty:

School s=user.getSchool() 

Он возвращает объект School, но есть все значения нулевых.

Почему значения равны нулю? Я смущен. В журнале все хорошо. Hibenate также вводит правильный запрос! Этот запрос возвращает данные, но использование значений диспетчера сущностей является нулевым. Что я могу сделать?

Если я изменю LAZY TO EAGER, ВСЕ РАБОТАЕТ ХОРОШО! НО Я НЕ НРАВИТСЯ OF Если я объединил() существующий школьный объект, он извлекает данные. Я не понимаю, почему?

ответ

2

Потому что вы определяете FetchType.LAZY выборки для школьной колонны; взгляните на FetchType.LAZY и FetchType.EAGER отличия от HERE. Если вы хотите получить не нулевой объект школы, есть 2 варианта:

  1. Изменить FetchType.LAZY для FetchType.EAGER
  2. Когда объект пользователя настойчивый вызов user.getSchool() внутри @Transaction аннотированный метод.
Смежные вопросы