2013-10-27 61 views
1

我有與其他實體,如下面的Boat實體OneToMany關係的實體。實際上,該實體有多個字段。檢索,而不使用JPA的關係,一個實體沒有延遲加載

@Entity 
public class Boat { 
    @Id 
    private long id; 
    private String name; 

    @OneToMany(fetch=FetchType.EAGER) 
    private List<Gun> guns; 

    public List<Gun> getGuns() { 
     return guns; 
    } 

    public String getName() { 
     return name; 
    } 
} 

對於某些搜索,我只是在Boat的基本屬性感興趣,不想檢索任何OneToMany關係。一種選擇是使所有OneToManyfetch=FetchType.LAZY的關係。

然而,延遲加載造成兩個問題:

  1. 延遲加載周圍產生OneToMany關係,我並不需要一個代理。我並不需要在所有訪問OneToMany關係,我需要每一個性能改進,我可以得到。
  2. 許多其他的查詢需要預先抓取,並改變所有OneToManyManyToOne關係,延遲加載會使得其他查詢繁瑣。

有沒有辦法選擇哪些關係應該動態檢索,而不使用懶惰抓取。這可能使用標準的JPQL嗎?

我在Glassfish的使用的EclipseLink。

我以前調查的EclipseLink取出組,哪種類型的剷斷我的問題。然而,我碰到這個問題:https://stackoverflow.com/questions/19577864/classdescriptor-returns-null-fetchgroupmanager-when-trying-to-create-an-eclipsel

+1

就我而言,惰性加載是默認加載,如果您使用的是ORM框架,則無法使用代理實現實體。這就意味着要完成像懶惰加載或只更新「如果需要」這樣的任務。我真的不認爲實體代理將會成爲你的性能瓶頸。 – Antoniossss

+0

在許多查詢中,我不想解決關係,所以沒有代理就沒有物化。即使沒有間接性能問題,將所有關係設置爲「lazy」也會損害所有其他需要加載的查詢。另外,EclipseLink不支持'lazy'作爲Java SE中的一對一和多對一關係的獲取模式[lazy'將被忽略]。所以對這些關係使用懶惰只能在Java EE容器中工作。 – Kevin

回答

1

如果你想要的只是名字或其他基本屬性,不要返回一個船隻實體。 JPA允許返回原始數據,而不是你的管理實體,如果這是你以後的事情。儘管對一個並非總是需要的關係使用懶惰會加快速度,但不會減慢它的速度,但當涉及到序列化並需要關係時,確實需要進行規劃。 Eclipselink還根據需要提供提取和屬性組以部分加載實體。有關詳細信息,請參閱http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup

+0

實際上,我的實體非常大,像這樣檢索數據將是一個麻煩的解決方法。 – Kevin

+0

告訴JPA你想要的不是解決方法。您是否看過屬性組,因爲它可能更符合您的需求。 – Chris

相關問題