2014-01-27 25 views
0

我正在使用JPA構建JSF CRUD Web應用程序。我想列出所有的實體類型Supplier我可以從數據庫中獲取。但是,在創建列表視圖時,Supplier中的一個字段(articleList)不是必需的,並且在列出Supplier的所有內容時,如果獲取該列表視圖,則會佔用大量時間。在這種情況下是否有辦法抑制這種情況,但在查看Supplier的詳細信息時是否獲取了該字段信息。列出的JPA實體持久字段未被提取

這是Supplier

@Entity 
@Table(name = "supplier") 
@NamedQueries({ 
    @NamedQuery(name = "Supplier.findAll", query = "SELECT s FROM Supplier s"), 
    @NamedQuery(name = "Supplier.findBySid", query = "SELECT s FROM Supplier s WHERE s.sid = :sid")}) 
public class Supplier implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "SID") 
    private Short sid; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 255) 
    @Column(name = "Supplier") 
    private String supplier; 
    @OneToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID") 
    private List<Article> articleList; 

我不wan't articleList執行的findAll查詢時,從數據庫填充。我能以某種方式控制它嗎?

+1

根據[documentation](http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html#fetch%28%29),「@ OneToMany」應該已經具有獲取類型LAZY ,所以你要麼重寫某處或訪問列表。任何你在某處調用'articleList.size()'的機會? – Thomas

+0

不,我沒那麼做。我不知道懶惰提取,並且@ OneToMany會默認這個。這更像是一個假設,它可能會成爲一個問題。 – numfar

+1

*除了OneToOne和ManyToOne之外,所有關係的默認獲取類型都是LAZY,* – MariuszS

回答

1

嘗試Lazy Fetchingfetch屬性設置好的給FetchType.LAZY

延遲抓取允許延期的關係的抓取,直到它被訪問。這不僅對於避免數據庫訪問非常重要,而且還可以避免在不需要時構建對象的成本。

使用範例

@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID") 
private List<Article> articleList; 

fetch - 定義從數據庫中提取數據的策略。 (...)LAZY策略是持久性提供程序運行時的一個暗示,即數據在第一次訪問時應該被延遲取出。

0

您可以使用LAZY屬性不fetchig此元素視圖模式。

@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH}, mappedBy = "supplierSID") 
private List<Article> articleList; 

有關詳細信息,需要編寫一個預加載此LAZY屬性的方法。例如:

public Supplier getFullSuplierEntity(Supplier supplier) { 
    supplier.getArticleList().size(); 
    return supplier; 
} 

在這種情況下,JPA運行更多sql SELECT來獲取articleList。