Спящий режим «нет сеанса или сеанс был закрыт» даже с привязкой сеанса в транзакционном методе - PullRequest
2 голосов
/ 01 марта 2012

Я использую Spring 3.0.5, Hibernate 3.6.7 и Vaadin.

У меня есть простая сущность, подобная этой

@Entity
public class Foo {
    @OneToMany(fetch = FetchType.LAZY)
    private Collection<Bar> bars;
    ...
}

У меня есть диалоговое окно, которое я получаю из контекста, и оно должно показывать «бары» из «foo».

@Component
@Scope("prototype")
public class FooBarDialogImp extends Window implements FooBarDialog {
    @Transactional(readOnly = true)
    public void populate(Foo foo) {
         ...
         for (Bar bar : foo.getBars()) {
             // populate the dialog with bar information
             ...
         }
    }
}

И когда пользователь просит показать foo бары, я делаю что-то вроде этого

 public class FooController {
 ...
     public void showFooBars(Foo foo) {
         FooBarDialog dialog = context.getBean(FooBarDialog.class);

         dialog.populate(foo);
         showDialog(dialog);
     }
 }

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

1 Ответ

8 голосов
/ 02 марта 2012

Вы указали тип ассоциации для коллекции как LAZY, поэтому она не загружается до тех пор, пока не будет вызван метод get для объекта-владельца.Предостережение для этого заключается в том, что он должен находиться в рамках сеанса, либо исходного, который его создал, либо нового.И предостережение от использования нового сеанса для загрузки ленивого списка состоит в том, что ваша сущность считается отделенной от него, и сначала вам нужно объединить , прежде чем вы сможете вызвать ленивый сбор.* Так что просто позвоните:

session.merge(foo);

Прежде чем пытаться повторить его bars.

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