2012-03-01 6 views
2

Я использую Spring 3.0.5, Hibernate 3.6.7 и Vaadin.Спящий режим «сеанс не был закрыт» даже с Session bound в методе транзакции

У меня есть простой объект, который, как это

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

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

@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); 
    } 
} 

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

ответ

8

Вы указали тип ассоциации для коллекции как LAZY, поэтому она не загружается до тех пор, пока не будет вызван метод getter на объект-владелец. Остановимся на том, что это должно быть в рамках сеанса, либо оригинального, либо созданного, либо нового. И предостережение от использования нового сеанса для загрузки ленивого списка состоит в том, что ваш объект считается отделенным от него, и сначала необходимо, чтобы он был merged, прежде чем вы сможете позвонить, чтобы получить ленивую коллекцию.

Так просто позвонить:

session.merge(foo); 

Прежде чем приступить к итерации его bars.

+0

awesome. Я не думал о том, что сущность отделена от сеанса. Ваш ответ дал свет, чтобы найти лучшее решение. Благодаря :) –

Смежные вопросы