java - Hibernate : Why FetchType. LAZY-annotated 集合属性急切加载?

标签 java hibernate jpa

我尝试实现简单的 one-to-many协会。在使用 Debug模式检查项目对象后,我发现 List<Bid> bids已经加载。但是List<Bid> 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");

}

编辑:我把断点放在语句 System.out.println("hello") 上.我检查了项目对象。看图片: enter image description here

最佳答案

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

与您的 toString() 方法相同,它隐式地循环遍历列表以打印它。

关于java - Hibernate : Why FetchType. LAZY-annotated 集合属性急切加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437521/

相关文章:

java - 方法完成后立即提交事务

java - 包装和使用安装程序后可执行文件不会在 Windows 上退出

java - 我可以将字符串转换为具有泛型类型的列表吗?

java - 在静态嵌套类中实例化/引用静态嵌套类

java - JPQL - 在查询中投影 @Embeddable 对象

java - 在 Play 框架中使用 ElementCollection 时出现 LazyInitializationException

java - 该语句被中止,因为它会导致唯一或主键约束或唯一索引中的重复键值由

java - 将自定义持久层迁移到 hibernate3

java - Java SE 中的 JPA 与 Java EE 性能对比

java - Spring JPA Query 返回 Null 而不是 List