Java Hibernate:为什么要急切地加载FetchType.LAZY注释的集合属性?
我试图实现简单的Java Hibernate:为什么要急切地加载FetchType.LAZY注释的集合属性?,java,hibernate,jpa,Java,Hibernate,Jpa,我试图实现简单的一对多关联。在使用调试模式检查item对象之后,我发现List bids已经加载。但是Listbids属性用FetchType.LAZY注释。一些书籍和网页声称,FetchType.LAZY是JPA提供者接受或拒绝的提示。但我想知道JPA提供者在什么情况下忽略了FetchType.LAZY。先谢谢你 @Entity @Table(name = "ITEM") public class Item implements Serializable { @I
一对多关联。在使用调试模式检查item对象之后,我发现List bids
已经加载。但是List
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 +
'}';
}
}
编辑:我将断点放在语句System.out.println(“hello”)
处。我检查了物品对象。如图所示:
通过检查调试器中的对象,您要求它调用列表的方法来显示其大小、内容等。当然,这会缓慢地初始化列表
您的toString()
方法也是如此,它隐式地循环列表以打印它。作为Hibernate文档
@OneToMany——默认的fetchType为LAZY
@manytone——默认的fetchType是EAGER
如果要更改,则fetch=fetchType.LAZY/EAGER
基本上,hibernate对象有两次1)实体对象2)值对象。因此,在您的情况下,项目与Bid有一对多的关系,如果您当时检索项目类,hibernate将不会获取相关的Bid类记录,因为您确实获取了类型是惰性的,但您获取了Bid类记录hibernate急切地为您获取相关项目,因为Bid与Item类有多通关系,并且多通的默认获取类型是“急切”的。如何确定它是急切地加载的?你的测试是什么?1-N有一个默认值LAZY,所以指定它是没有意义的。提供程序所做的是特定于您的JPA提供程序的(没有“声明”它只是一个提示…这是JPA规范中的)。我使用的提供者(DataNucleus)始终尊重我告诉它要使用的内容。你的可能认为它比你更清楚?NeilStockton Hibernate当然支持延迟加载。是的,JPA规范确实说:。通过检查调试器中的对象,您要求它调用列表的方法来显示其大小、内容等。当然,这会惰性地初始化列表。你的toString()方法也是如此,它隐式地循环列表以打印它。看到你的答案后,我觉得我的问题像是愚蠢的问题。我考虑过删除这篇文章,因为我太丢脸了。现在,我对得票的数量感到惊讶,我很高兴,即使是我愚蠢的问题也能为其他人派上用场。再次感谢你的回答。@没有必要为此感到羞耻。只有当我们尝试时,我们才会了解。我在谷歌上输入了同样的关注,并在你的帖子上看到一个问题如何帮助他人。谢谢你的邀请
@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");
}