Java 理解懒惰的获取
测试用例:Java 理解懒惰的获取,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,测试用例: @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 p
@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 + */"]";
}
}
问题:虽然我将person
属性标记为lazy&&optional,但为什么它是SQL查询的一部分?这是否意味着Hibernate并不是懒散地抓取?项目的情况也是如此
如何惰性地获取属性?hibernate似乎只加载外键值,而不是整个人或项目。有什么问题吗?hibernate似乎只加载外键值,而不是整个人或项目。有什么问题吗?
Person
是单个(字符串)属性
在同一个对象上执行其他抓取(对于像bidId
和bidmount
这样的非惰性抓取)时抓取它是常识
由于无论如何都必须执行查询,因此将varchar
(或任何内容)与bidId
和bidamunt
一起传输不会产生太多开销
它加载项id(而不是项本身),以便在调用
getItem()
时可以加载项本身,而无需另一个查询来获取id(在构造和getItem()
调用之间缓存id)Person
是单个(字符串)属性
在同一个对象上执行其他抓取(对于像bidId
和bidmount
这样的非惰性抓取)时抓取它是常识
由于无论如何都必须执行查询,因此将varchar
(或任何内容)与bidId
和bidamunt
一起传输不会产生太多开销
它加载项id(而不是项本身),这样在调用
getItem()
时就可以加载项本身,而无需另一个查询来获取id(将id缓存在构造和getItem()
调用之间)以使person属性(与关联相反)真正懒惰,您必须在构建时使用字节码对类进行指令插入。参考文档中有一些关于如何执行此操作的信息
要使person属性(与关联相反)真正懒惰,必须在构建时使用字节码对类进行指令插入。参考文档中有一些关于如何执行此操作的信息
@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);
}
}
/*
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_