将Glassfish 3.1与Eclipselink一起用作JPA提供程序。使用以下代码获得无状态bean,并将Folder类映射到表。每个文件夹都可以拥有它的父文件夹。
无状态bean得到以下代码。
@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;
}
考虑以下情况,Servlet调用此bean来获取所有文件夹,并在调用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不会抛出以及容器如何知道他应该从何处获取连接。请有人解释一下
答案 0 :(得分:6)
嗯,这种情况来自eclipselink架构.Eclipselink JPA实现stil使用传统的Toplink会话架构。有一个全局服务器会话,对于非事务操作,从该服务器会话产生一个新的客户端会话,用于事务操作UnitOfWork会话产生..在你的情况下,不需要事务,因为它只是一个读操作...但是如果你改变你的实体并调用merge方法,你会得到Exception ..有关更多信息,你可以阅读this link