【问题标题】:Understanding JPA lazy loading了解 JPA 延迟加载
【发布时间】:2011-07-27 16:29:51
【问题描述】:

使用带有 Eclipselink 的 Glassfish 3.1 作为 JPA 提供程序。使用以下代码获得无状态 bean,并将文件夹类映射到表。每个文件夹都可以有它的父文件夹。

无状态 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 不抛出以及容器如何知道他应该从哪里获得连接。谁能解释一下

【问题讨论】:

  • EntityManagerPersistenceContextType 是什么?

标签: java jpa ejb eclipselink


【解决方案1】:

好吧,这种情况是由 eclipselink 架构引起的。Eclipselink JPA 实现仍然使用传统的 Toplink 会话架构。有一个全局服务器会话,对于非事务性操作,从该服务器会话生成一个新的客户端会话,用于事务性操作会产生一个 UnitOfWork 会话。在您的情况下,不需要事务,因为它只是一个读取操作...但是如果您更改实体并调用合并方法,您会得到异常。有关更多信息,你可以阅读this link

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2019-02-18
    • 2011-12-20
    • 2011-10-02
    • 2021-02-04
    • 2019-04-28
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多