annotated collection property eagerly loading?

I tried to implement simple one-to-many association. after inspecting the item object with debugging mode, I found that List<Bid> bids already loaded. But List<Bid> bids property is annotated with FetchType.LAZY. some books and web pages claim that FetchType.LAZY is a hint JPA providers accept or reject. But I wonder on what condition JPA providers ignore FetchType.LAZY. Thank you in advance.

@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");

    }

EDIT : I put break point at the statement System.out.println("hello") . I inspected the item object. see the picture : 在这里输入图像描述


By inspecting the object in your debugger, you're asking it to call methods of the list to display its size, content, etc. And that of course initializes the list, lazily.

Same for your toString() method, which implicitely loops through the list to print it.


As Hibernate docs @OneToMany--default fetchType is LAZY @ManyToOne--default fetchType is EAGER.

If you want to change then fetch=fetchType.LAZY/EAGER

Basically, There are two times of hibernate object 1)Entity Object 2)Valued Object.So in your case Item have a to-many relationship with Bid, If you retrieve Item class at that time hibernate will not fetch related Bid Class record because you did fetch type is LAZY, But you fetch Bid Class record hibernate fetch related Item eagerly for you, because Bid has a ManyToOne relationship with Item class and default fetch type for ManyToOne is EAGER.

链接地址: http://www.djcxy.com/p/37046.html

上一篇: 休眠:更新关联的对象

下一篇: 注释集合属性热切地加载?