Hibernate Lazy Load Ошибка после слияния - PullRequest
1 голос
/ 28 июля 2011

Я использую vanilla Spring MVC с пользовательской реализацией FlashScope.Мы в основном используем его, чтобы следовать шаблону Post-Redirect-Get.

Я столкнулся со странной ситуацией.В своем посте я выполняю поиск параметров, введенных пользователем, и устанавливаю эти экземпляры на FlashScope.Я вижу, эти штуки работают просто отлично.

В объекте, который я помещаю на FlashScope, у меня есть отложенная загрузка коллекции, однако, когда я пытаюсь получить доступ к коллекции следующим образом:

entity.getLazyLoadedCollection();

Я получаю следующую трассировку стека:

ERROR org.hibernate.LazyInitializationException IP127.0.0.1 CV#4c44559c-c576-4732 P#75004 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at core.model.entities.WorkflowState_$$_javassist_36.getFunctions(WorkflowState_$$_javassist_36.java)

Странно то, что прямо перед вызовом выше я объединяю его с сеансом на своем уровне обслуживания:

getSession().merge(entity);

Документация Hibernate заявляет, что я должен вызвать update, еслиЯ знаю, что работаю с новым сеансом, но JavaDocs создает впечатление, что я должен вызывать слияние ...

В качестве обходного пути я сделал следующее:

if (getSession().contains(entity)) {
    getHibernateTemplate().merge(person);
} else {
    getSession.update(entity);
}

Что мне здесь делать?

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Прочитайте javadoc, который вы тщательно связали: «Верните постоянный экземпляр. Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр. Данный экземпляр не становится связанным с сеансом».

Независимо от того, что вы передаете merge (), этот объект не будет связан с сеансом. Вам нужно работать с объектом, возвращенным из merge ().

0 голосов
/ 28 июля 2011

Никогда не работал с FlashScope, но ваша ошибка, скорее всего, связана с тем, что вы пытаетесь получить доступ к коллекции LAZY, которая не была инициализирована, и вы больше не находитесь в слое своего приложения, имеющего доступ к Hibernate Session. Если это предположение верно, вам нужно инициализировать коллекцию, где у вас есть доступ к Session (например, вашему DAO). Вот 2 основных способа:

Hibernate.initialize(object.getMyLazyCollection());

или

if(object.getMyLazyCollection() != null) {
   object.getMyLazyCollection().size(); // forces a collection load
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...