2011-04-01 41 views
1

使用Glassfish 3.1和Eclipselink作爲JPA提供程序。使用下面的代碼和文件夾類將無狀態bean映射到表。每個文件夾可以有它的父文件夾。瞭解JPA懶加載

無狀態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

什麼是'EntityManager'的PersistenceContextType? – CMR 2011-04-01 13:05:26

回答

6

好吧,這種情況來自eclipselink體系結構.. Eclipselink JPA實現stil使用傳統的Toplink會話體系結構..有一個全局服務器會話,對於非事務性操作,新的客戶機會話是從這個服務器會話,對於事務操作,一個UnitOfWork會話被產生..在你的情況下,不需要事務,因爲它只是一個讀操作...但是如果你改變你的實體並調用合併方法,你會得到Exception ..欲瞭解更多信息,你可以閱讀this link