当前位置: 首页 > 知识库问答 >
问题:

Hibernate:为什么FetchType.lazy注释的集合属性急切地加载?

胡博艺
2023-03-14

我尝试实现简单的一对多关联。在使用调试模式检查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 +
                '}';
    }
}
@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");

    }

共有2个答案

宋智明
2023-03-14

Hibernate docs@OneTomany--默认fetchType是LAZY@ManyToOne--默认fetchType是eager。

如果要更改,则fetch=fetchType.lazy/eager

基本上,有两次hibernate对象(1)实体对象(2)值对象(2)。所以在您的情况下,Item与Bid有对多的关系,如果您当时检索Item类,hibernate将不会获取相关的Bid类记录,因为您确实获取类型是懒惰的,但是您获取Bid类记录hibernate为您获取相关的Item,因为Bid与Item类有ManyToOne关系,并且ManyToOne的默认获取类型是Eager。

哈扬
2023-03-14

通过在调试器中检查对象,您要求它调用列表的方法来显示其大小、内容等,这当然会懒洋洋地初始化列表。

您的toString()方法也是如此,它隐含地在列表中循环以打印它。

 类似资料:
  • 我见过几个类似的问题有0个好答案。 这应该非常简单。我正在使用 Java JPA,有时想要加载子实体列表,但不是所有时间。不幸的是,当我说要懒惰地获取它时,JPA似乎没有听我的话。我已经 100% 确定在我的代码中没有任何地方以任何方式访问 childEntities 属性。但是,在我的 JPA.em(.)查找(.)调用时,所有子实体仍然会立即加载。这就是我如何声明与注释的关系。 我是这样加载父实

  • 我通过提示检查了它在EclipseLink中的工作情况: 这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避

  • 我无法通过下面的示例了解如何快速加载。这是我当前的数据库,有两个表,Quotes:存储一般信息的地方,QuotesDetails:存储Quotes中每个Quote的详细信息的地方。 在模型中,我有以下结构: 引用。php QuotesDetails.php以下型号: 我使用了hasMany(引号中),因为每个引号可以有/显示3-4个quotesdetails。 在我的控制器中,我使用以下查询: 在

  • 即使我的流不是空的,回退流总是会被创建?这样做背后的意图是什么?这是极不地道的。

  • 考虑下面的API方法,它取自Shiro的接口,但也可能存在于其他库中: 是的,即使是现在,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?! 如果我现在想将此方法与流或选项一起使用,如下所示: 我收到一条关于未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 日食: 类型安全:收集(Collector)方法属于原始类型Stream javac: 注意:GenericsT

  • 问题内容: 我有这样的实体: 还有一个: 使用Criteria API,我想获得带有过滤的Picturs集的唯一AlbumD。我尝试这样的事情: 在这里,我得到了带有所有关联图片的相册。它们根本没有被过滤。当我尝试执行记录器打印的查询时,只有给定eventId的图片数量只有四行,但是在“相册”中,我获取了所有图片。 我也尝试了其他ResultTransformers,但最终得到了很多结果(4),但