我試圖實現簡單的一對多關聯。在用調試模式檢查項目對象後,我發現列表<出價>出價已經加載。但列表<出價>出價屬性註釋了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")
突破點。我檢查了物品對象。看到圖片:
你如何確定它是熱切加載的?你的測試是什麼? –
1-N有一個默認的懶惰,所以指定它是毫無意義的。提供程序所做的特定於您的JPA提供程序(沒有「聲明」,它僅僅是一個提示...在JPA規範中)。我使用的提供商(DataNucleus)始終尊重我告訴它使用的內容。你可能認爲它比你知道的更好?它比你更瞭解嗎? –
@NeilStockton Hibernate當然支持延遲加載。是的,JPA規範說:https://docs.oracle.com/javaee/7/api/javax/persistence/OneToMany.html#fetch--。 –