使用带有 Eclipselink 的 Glassfish 3.1 作为 JPA 提供程序。使用以下代码获得无状态 bean,并将 Folder 类映射到表。每个文件夹都可以有它的父文件夹。
Stateless 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 以及容器如何知道他应该从哪里获得连接。有人可以解释一下吗
最佳答案
好吧,这种情况是由 eclipselink 架构引起的。Eclipselink JPA 实现仍然使用遗留的 Toplink session 架构。有一个全局服务器 session ,对于非事务性操作,从该服务器 session 生成一个新的客户端 session ,对于事务性操作产生一个 UnitOfWork session 的操作。在你的情况下,不需要事务,因为它只是一个读取操作......但是如果你改变你的实体并调用合并方法,你会得到异常......有关更多信息,你可以阅读 this link
关于java - 了解 JPA 延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513683/