2016-11-05 56 views
1

我試圖實現簡單的一對多關聯。在用調試模式檢查項目對象後,我發現列表<出價>出價已經加載。但列表<出價>出價屬性註釋了FetchType.LAZY。一些書籍和網頁聲稱FetchType.LAZY是JPA提供商接受或拒絕的提示。但是我想知道JPA提供者忽略FetchType.LAZY的條件。先謝謝你。Hibernate:爲什麼FetchType.LAZY註解的集合屬性急切加載?

 
@Entity 
@Table(name = "ITEM") 
public class Item implements Serializable { 

    @Id 
    private Long id = null; 

    private String name; 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "SELLER_ID", nullable = false) 
    private User seller; 

    @OneToMany(mappedBy = "item", fetch = FetchType.LAZY) 
    private List<Bid> bids; 

    /** 
    * No-arg constructor for JavaBean tools. 
    */ 
    public Item() {} 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public User getSeller() { 
     return seller; 
    } 

    public void setSeller(User seller) { 
     this.seller = seller; 
    } 

    @Override 
    public String toString() { 
     return "Item{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", seller=" + seller + 
       ", bids=" + bids + 
       '}'; 
    } 
} 
 
@Entity 
@Table(name = "BID") 
public class Bid implements Serializable { 

    @Id @GeneratedValue 
    @Column(name = "BID_ID") 
    private Long id = null; 

    @ManyToOne 
    @JoinColumn(name = "ITEM_ID", nullable = false, updatable = false, insertable = false) 
    private Item item; 

    @ManyToOne 
    @JoinColumn(name = "BIDDER_ID", nullable = false, updatable = false) 
    private User bidder; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Item getItem() { 
     return item; 
    } 

    public void setItem(Item item) { 
     this.item = item; 
    } 

    public User getBidder() { 
     return bidder; 
    } 

    public void setBidder(User bidder) { 
     this.bidder = bidder; 
    } 

    @Override 
    public String toString() { 
     return "Bid{" + 
       "id=" + id + 
       ", bidder=" + bidder + 
       '}'; 
    } 
} 
 
private static void itemSeller(EntityManager em) { 

     Item item = em.find(Item.class, 1L); 
     System.out.println("hello"); 

    } 

編輯:我把在聲明System.out.println("hello")突破點。我檢查了物品對象。看到圖片: enter image description here

+0

你如何確定它是熱切加載的?你的測試是什麼? –

+0

1-N有一個默認的懶惰,所以指定它是毫無意義的。提供程序所做的特定於您的JPA提供程序(沒有「聲明」,它僅僅是一個提示...在JPA規範中)。我使用的提供商(DataNucleus)始終尊重我告訴它使用的內容。你可能認爲它比你知道的更好?它比你更瞭解嗎? –

+0

@NeilStockton Hibernate當然支持延遲加載。是的,JPA規範說:https://docs.oracle.com/javaee/7/api/javax/persistence/OneToMany.html#fetch--。 –

回答

4

通過在調試器檢查對象,你問它來調用列表的方法來顯示它的大小,內容等這當然初始化列表,懶洋洋地。

與您的toString()方法相同,該方法隱式地遍歷列表以打印它。

0

作爲Hibernate文檔 @ OneToMany - 默認fetchType是LAZY @ ManyToOne - 默認fetchType是EAGER。

如果你想改變,然後取= fetchType.LAZY/EAGER

基本上,有你的情況項尊貴Object.So休眠對象1)實體對象2)的兩倍還一個一對多的關係如果您在此時檢索Item類,hibernate將無法提取相關的Bid類記錄,因爲您的提取類型爲LAZY,但您會爲您熱切地提取Bid類記錄hibernate fetch相關項,因爲Bid與Item類具有ManyToOne關係ManyToOne的默認獲取類型是EAGER。