2017-01-10 53 views
1

我定義如下JPA - EntityGraph和Hibernate的L2 Cache(ehcache的)

@Cacheable 
@Entity 
@NamedEntityGraph(
    name = "Parent.Child", 
    attributeNodes = { 
     @NamedAttributeNode("children"), 
    } 
) 
public class Parent { 
    private Set<Child> children; 
    // getter - setter 
} 

現在在我的DAL一個一對多的關係,我調用此方法

@Override 
    public Parent getParentWithChildren(int id) { 
     EntityGraph<?> graph = entityManager.getEntityGraph("Parent.Child"); 
     Map<String, Object> props = new HashMap<>(); 
     props.put("javax.persistence.fetchgraph", graph); 
     return entityManager.find(Parent.class, id, props); 
    } 

由於我已經加載了父母與子女,我應該可以使用子女收集交易之外。但我得到懶惰初始化異常。只有在啓用休眠級別2緩存 - ehcache時纔會發生這種情況。如果我從配置中禁用它,它按預期工作。此外,如果我找到後明確初始化收集,它按預期工作。那麼這是一個錯誤?我正在使用Hibernate 5.2.6.Final和JPA 2.1。

編輯:我還注意到的一件事是,實體首次加載罰款,所以這個問題必須與休眠&緩存提供程序有關。

+0

我遇到類似的情況。我不使用二級緩存。我意識到,如果實體已經在持久化上下文中,那麼使用fetchgraph提示的下一個em.find不會加載數據庫中的任何內容。在我看來,這也是bug。 – srnjak

+0

我認爲會話緩存也是如此。這是一個確認的錯誤,它被標記爲在5.2.10 – user2578525

回答

0

不,這不是一個錯誤。我猜Hibernate會延遲從緩存加載直到真正需要。除非您要求提前獲取,否則實現可能會認爲是合適的。

所以一般的規則是在離開事務之前加載你需要的所有東西(在關閉Hibernate會話之前要精確)。

+0

中解決我已經在使用獲取圖來急切地加載子集合 – user2578525

+0

您沒有給我足夠的信息來證明它,但我懷疑它實際上是代理中的對象被延遲加載。 – Henri

+1

查看道具對象。我指定獲取圖形 – user2578525