2016-07-21 140 views
0

我有一個實體父母和一個關係@OneToMany到另一個實體孩子。收集兒童設置爲延遲加載。如何延遲加載嵌套集合?

@Entity 
class Parent{ 
    @Id 
    String parentId; 
    @OneToMany(mappedBy="parent",fetch=FetchType.LAZY) 
    List<Child> children; 
} 

@Entity 
class Child{ 
    @Id 
    String childId; 
    @ManyToOne 
    @JoinColumn(name="parentId") 
    Parent parent; 
} 

List<Parent> loadParents() { 
    QParent qParent = QParent.parent; 
    List<Parent> parentList = query.select(qParent).from(qParent).fetch(); 
    return parentList; 
} 

@Transactional 
void test(){ 
    List<Parent> parentList = loadParents(); 
    for(Child child:parentList.getChildren()){ 
     child.getChildId(); 
    } 
} 

我得到了著名

org.hibernate.LazyInitializationException:無法初始化懶洋洋作用 一家集...無法初始化代理 - 沒有會話

例外我訪問子列表的行上的test()方法。

我不想更改實體中的獲取類型註釋。

如何訪問子實體?

回答

1

我發現了罪魁禍首。交易管理被禁用。

@Transactional註解從測試方法中缺失。

啓用事務管理,把這個應用程序的context.xml:

<tx:annotation-driven /> 

這沒有什麼錯的代碼,但配置是不完整的。爲了急切地加載嵌套集合,我們需要的是一個擁抱事務。

打開org.springframework.orm和org.hibernate的調試日誌記錄幫助我確定了問題的根源。

同類問題和解答:LazyInitializationException in JPA and Hibernate