java - 了解 JPA 延迟加载

标签 java jpa ejb eclipselink

使用带有 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/

相关文章:

java - JPA 获取重复的行(结果都具有相同的值)

JPA 左连接查询不会在 Spring Boot 中实例化子集合?

java - EJB3Unit 需要 @LocalBean 的业务接口(interface)

java - 注入(inject) HttpServletRequest

java - 我想得到一些关于一只耳朵中多个 ejb-jar 的建议

java - 比较 Maven 中的 Java 字符串传递编码

java - Spring Security 中同一资源的经过身份验证和未经身份验证的 View

java - @SequenceGenerator 的架构属性在 Hibernate 中不起作用

java - 如何在java中正确检索所有行?

java - Log4j 多个 Web 应用程序的通用日志文件?