Понимание JPA ленивой загрузки - PullRequest
1 голос
/ 01 апреля 2011

Использование Glassfish 3.1 с Eclipselink в качестве поставщика JPA на борту.Получил компонент без сохранения состояния со следующим кодом и классом Папки, который сопоставлен с таблицей.У каждой папки может быть родительская папка.

Бин без состояния получил следующий код.

 @TransactionAttribute(TransactionAttributeType.REQUIRED)
   public List<Folders> getUserFolders() {
    return folderDao.findFolders();
   }

И класс сущностей

public class Folder {

    @ManyToOne(fetch=FetchType.LAZY)
    private Folder parent;

    @OneToMany(targetEntity=Folder.class, mappedBy="parent", fetch=FetchType.LAZY)
    private List<Folder> childFolders;

}

Рассмотрим следующую ситуацию, сервлет вызывает этот бин дляполучить все папки и выполнить итерацию в цикле по папке, вызывая метод getChildFolders ().

FINEST: Connection acquired from connection pool [read].
FINEST: reconnecting to external connection pool
FINE: SELECT ID, FOLDERNAME, POSITION, OWNER_ID, PARENT_ID FROM t_user_folder WHERE (PARENT_ID = ?)
    bind => [1 parameter bound]
FINEST: Connection released to connection pool [read].

Вызов метода getChildFolders () происходит вне транзакционного метода, постоянный контекст уже очищен.И я не могу понять, почему LazyInitializationException не генерирует и как контейнер знает, откуда он должен получить соединение.Может кто-нибудь объяснить это, пожалуйста

1 Ответ

6 голосов
/ 01 апреля 2011

Что ж, такие ситуации возникают из-за архитектуры eclipselink. В реализации Eclipselink JPA все еще используется устаревшая архитектура сеанса Toplink. Существует один глобальный серверный сеанс, для нетранзакционных операций новый сеанс клиента создается из этого серверного сеанса, для транзакционногооперации порождает сеанс UnitOfWork .. В вашем случае нет необходимости в транзакции, потому что это просто операция чтения ... Но если вы измените свою сущность и вызовете метод слияния, вы получите Exception. Для получения дополнительной информации,Вы можете прочитать эту ссылку

...