【发布时间】:2017-03-19 03:56:05
【问题描述】:
我尝试实现简单的one-to-many 关联。在使用调试模式检查项目对象后,我发现 List<Bid> bids 已经加载。但是List<Bid>bids 属性用FetchType.LAZY 注释。一些书籍和网页声称FetchType.LAZY 是 JPA 提供者接受或拒绝的暗示。但我想知道 JPA 提供商在什么情况下会忽略 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");
}
【问题讨论】:
-
你如何确定它是热切加载的?你的测试是什么?
-
1-N 的默认值为 LAZY,因此指定它是没有意义的。提供者所做的是特定于您的 JPA 提供者(没有“声称”它只是一个提示......在 JPA 规范中)。我使用的提供者 (DataNucleus) 始终尊重我告诉它使用的内容。你的可能认为它比你更了解?它比你更了解吗?
-
@NeilStockton Hibernate 当然支持延迟加载。是的,JPA 规范确实这么说:docs.oracle.com/javaee/7/api/javax/persistence/….
-
通过检查调试器中的对象,您要求它调用列表的方法以显示其大小、内容等。这当然会懒惰地初始化列表。您的 toString() 方法也是如此,它会隐式循环遍历列表以打印它。