2011-06-05 109 views
1
@Entity 
public class Bid { 

    @Id 
    @GeneratedValue 
    @Column(name = "bid_id") 
    private Long bidId; 

    @Column(name = "bid_amt") 
    private double bidAmount; 

    @Basic(fetch = FetchType.LAZY, optional = false) 
    private String person; 

    @ManyToOne(targetEntity = Item.class, fetch = FetchType.LAZY) 
    @JoinColumn(name = "bid_item", referencedColumnName = "item_id", nullable = false) 
    private Item item; 

    public Long getBidId() { 
     return bidId; 
    } 

    public double getBidAmount() { 
     return bidAmount; 
    } 

    public String getPerson() { 
     return person; 
    } 

    public Item getItem() { 
     return item; 
    } 

    public void setBidAmount(final double bidAmount) { 
     this.bidAmount = bidAmount; 
    } 

    public void setPerson(final String person) { 
     this.person = person; 
    } 

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

    public Bid() { 
    } 

    @Override 
    public String toString() { 
     return "Bid [bidId=" + bidId + ", bidAmount=" + bidAmount + ", person=" 
       + person + /* ", item=" + item + */"]"; 
    } 

} 

測試用例:瞭解懶惰取

@Test 
    public void testBidRead() { 
     final Session currentSession = sessionFactory.getCurrentSession(); 
     final List<Bid> bids = currentSession.createQuery("from Bid").list(); 
     for (final Bid bid : bids) { 
      System.out.println(bid); 
     } 
    } 

和SQL Hibernate生成的是:

/* 
from 
    Bid */ select 
     bid0_.bid_id as bid1_1_, 
     bid0_.bid_amt as bid2_1_, 
     bid0_.bid_item as bid4_1_, 
     bid0_.person as person1_ 
    from 
     Bid bid0_ 

問:雖然我標誌着person屬性爲懶& &可選,爲什麼它是SQL查詢的一部分?這是否意味着Hibernate不會懶惰地取出?項目的情況也是如此。

如何獲取屬性的懶惰?

回答

1

似乎hibernate只是加載外鍵值,而不是整個Person或Item。它出什麼問題了?

2

Person是單個(串)屬性

擷取它,而其他讀取(對於非延遲取像bidIdbidAmount)在同一對象上做是常識

作爲查詢有無論如何都要執行和運輸varchar(或其他)與bidIdbidAmount沿沒有太大的開銷

而且它在加載項ID(不是物品本身),因此當您撥打getItem()時無需另一個查詢即可獲取該物品(緩存施工和getItem()之間的ID)