Использование 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 не генерирует и как контейнер знает, откуда он должен получить соединение.Может кто-нибудь объяснить это, пожалуйста