Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:为什么要急切地加载FetchType.LAZY注释的集合属性?_Java_Hibernate_Jpa - Fatal编程技术网

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

}