注释集合属性热切地加载?
我试图实现简单的一对多关联。 在用调试模式检查项目对象之后,我发现List <Bid>出价已经加载。 但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");
}
编辑:我把断点放在声明System.out.println("hello") 。 我检查了物品对象。 看到图片: 
通过在你的调试器中检查对象,你要求它调用列表的方法来显示它的大小,内容等。当然,这也是懒惰地初始化列表。
您的toString()方法也是如此,它隐式地遍历列表以打印它。
作为Hibernate docs @ OneToMany - 默认fetchType是LAZY @ ManyToOne - 默认fetchType是EAGER。
如果你想改变,那么fetch = fetchType.LAZY / EAGER
基本上,有两个hibernate对象1)Entity Object 2)有价值的Object.So在你的案例中Item与Bid有多对多的关系,如果你在此时检索Item类,hibernate不会获取相关的Bid类记录,因为你获取类型是LAZY,但是您为您热切地获取Bid类记录hibernate获取相关项目,因为Bid与Many Item的ManyToOne关系以及ManyToOne的默认获取类型是EAGER。
链接地址: http://www.djcxy.com/p/37045.html