Hibernate: нет сеанса после сохранения новой сущности



Я создаю новую сущность, сохраняю ее в первый раз и затем хочу получить доступ к коллекциям связанных классов:



 @Override
protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
final E entity = (E) form.getModelObject();
getDao().save(entity); //calls session.saveOrUpdate(entity)
LOG.debug("Saved entity " + entity);
LOG.debug("Show collections " + entity.getField().getListOfSomething());
parent.replaceContentPanel(parent.getDetailsPanel(parent.createReloadableModel(entity)), target);
}


Я получаю следующую ошибку на второй строке журнала:



org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role:
no session or session was closed


Я тоже пробовал



Hibernate.initialize(getDetailsModel().getObject().getField().getListOfSomething());


Это приводит к другой ошибке:



org.hibernate.HibernateException: collection is not associated with any session


Это не очень удивительно, когда при отладке я вижу, что прокси коллекции не имеют сеанса, связанного с ними.



Я использую фильтр openSessionInView, который приходит с пружинным каркасом. Код прекрасно работает, кстати, когда я хочу обновить существующую сущность. Это также работает, когда я устанавливаю fetchType в нетерпеливый на коллекции:



@OneToMany(mappedBy = "field", fetch = FetchType.EAGER)
private List<E> listOfSomething= new ArrayList<E>();


Действительно ли мне нужно установить это в нетерпеливый? Я очень хочу этого избежать и надеялся, что найду способ обойти это. Есть ли способ связать новую сохраненную сущность с сеансом гибернации? Я пробовал и session.load(entity) , и session.merge(entity), но безуспешно.



Мои сущности выглядят так:



@Entity class A { 
@ManyToOne B b;
}

@Entity class B {
@OneToMany(mappedBy = "b") List<A> aList;
@OneToMany(mappedBy = "b") List<C> cList;
}

@Entity class C {
@ManyToOne B b;
}


Кто я такой делать-это создать c = new C(), выбрать b из DropDownChoice и на submit я хочу сохранить getDao().save(c). После отправки я хочу отобразить мою новую сущность на другой панели, которая загружается через ajax. Например, я хочу отобразить c.getB().getAList(), и именно там происходит исключение, потому что b, выбранный из DropdownChoice, является обособленной сущностью, и это aList не было извлечено и не может быть загружено лениво.



Я не могу понять, как перенести все еще существующую сессию в мою новую C пример.



Вот еще информация из моего web.xml



<filter>
<filter-name>opensessioninview</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>opensessioninview</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
751   2  

2 ответов:

Подходящим обходным путем является слияние() объекта, содержащего коллекцию, перед обращением к коллекции.

Я нашел обходной путь, который позволяет мне принудительно загружать коллекции, которые, как я знаю, мне понадобятся с Hibernate.initialize(...)

final ListModel<B> listModel = new ListModel<B>(bList);
for (final B b : bList) {
   Hibernate.initialize(b.getAList());
}
add(new DropDownChoice<B>("b", listModel, new ChoiceRenderer<B>("name", "id")));

Когда я добавляю строки 2-4 из этого фрагмента в свою форму, все экземпляры B, которые я мог бы позже выбрать для моего нового экземпляра C, будут иметь инициализированный список A.

Я только наполовину доволен этим. Я все же предпочел бы иметь возможность присоединить объект к сеансу гибернации по требованию.

Comments

    Ничего не найдено.