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_