Hibernate и Spring, загрузите коллекцию, которая находится в ленивом режиме - PullRequest
1 голос
/ 06 декабря 2011

Я использую Spring для управления транзакциями на моем сервисном уровне с аннотацией @Transactional.Это хорошо для загруженной коллекции, но плохо для отложенной загрузки.

Я не могу использовать шаблон OSV, мое приложение является автономным настольным клиентским приложением.

Так что яЯ подумал о решении, и вот что я пытался сделать:

public abstract class TransactionTask {

    public TransactionTask() {
    }

    public abstract void job(); 
}

В моем сервисе у меня есть:

@Transactional
public void doJob(Transactiontask tt){
    tt.job();
}

И как я его использую:

myService.doJob(new TransactionTask() {

    @Override
    public void job() {
        //lazy code here
    }
});

Я ожидаю увидеть этот код работающим, потому что сеанс открыт в методе doJob (он помечен как транзакционный), но он не работает ... исключение составляет no session or session was closed.Почему этот код не работает, и как я могу загрузить коллекцию только тогда, когда она мне нужна?

Я не хочу писать сервис с указанным методом для загрузки коллекции, это не решение.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Ленивая загрузка не требует просто сеанса , она требует сеанса , к которому присоединен ваш Entity.Вам необходимо прикрепить объекты к новому сеансу, созданному @Transactional, прежде чем пытаться получить доступ к ленивым полям.

Кроме того, хотя вы, очевидно, не можете использовать один из доступных фильтров сервлета OSIV, «шаблон» имеет видвсе еще действует.Должна быть определенная область действия, с которой вы можете связать жизненный цикл сеанса.(Он может оказаться настолько большим, что есть другие проблемы, которые не стоят усилий, но это все еще вариант.)

0 голосов
/ 06 декабря 2011

например. у вас есть User user объект. Он отключен, поэтому вы получили «исключение - сеанс не закрыт или сеанс закрыт».

Вы можете перечитать его из дао user=userDao.findById(user.getId()), а затем получить ленивые коллекции вновь полученного объекта.

...