Spring hibernate ошибка о ленивой загрузке - PullRequest
0 голосов
/ 31 января 2011

Я просто новичок в спячке + весна.Я делаю простой проект и настраиваю все для транзакций, простого сервиса, простого дао и всех аннотированных бинов.

Используя список работ, я могу составить список объектов и их свойств, используя запрос Criteria.Но если я пытаюсь загрузить объект с помощью:

Session sess = sessionFactory.getCurrentSession();
Ordine res = (Ordine) sess.load(Ordine.class, id);
return res;

, запрос, кажется, работает нормально, но я получаю неприятное исключение, когда представление пытается прочитать свойство (строку):

org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса

Я даже заметил, что это журналы запуска:

ИНФОРМАЦИЯ: Bean 'mySessionFactory'типа [class org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean] не подходит для обработки всеми BeanPostProcessors (например: не подходит для автоматического проксирования)

Что все это значит

Ответы [ 4 ]

4 голосов
/ 31 января 2011

У вас есть несколько вариантов, как я это вижу

  • Принудительно не загружать ваш объект (например, установите fetch=FetchType.EAGER в ваших аннотациях постоянства).
  • OpenSessionInViewFilter
  • Вызовите методы вашей подпрограммы на уровне данных (для загрузки значений), прежде чем вызывать их в своем представлении.

[Редактировать] Похоже, что это совсем не работает, как я изначально предлагал.

  • Добавить транзакций .Аннотируйте подпрограмму вашего контроллера, используя @Transactional.
0 голосов
/ 31 января 2011

org.hibernate.Hibernate -class имеет несколько удобных статических служебных методов, например, см. Hibernate.initialize . Вам все еще нужно открытое заседание для этого все же. Самым простым способом, вероятно, является использование OpenSessionInViewFilter, установка типов выборки в стремление или изменение запроса для загрузки отложенных отношений, как это предлагается в других ответах.

0 голосов
/ 31 января 2011

Шон,

Предложение Йохана о настройке fetch = FetType.EAGER - ваше простейшее решение.Вы должны быть осторожны, используя это решение.Иногда вы можете решить свою проблему, изменив свой дао-запрос, чтобы выполнить выборку левого соединения для интересующей вас связанной сущности, например:

Query q = this.em.createQuery("select x from PrimaryEntity x \n"
+ "left join fetch x.secondaryEntityField \n "
+ "where x.selectionProperty = :selection");
0 голосов
/ 31 января 2011

Вам, вероятно, нужно использовать OpenSessionInViewFilter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...