【问题标题】:Hibernate LAZY fetch not initializing an instanceHibernate LAZY fetch 未初始化实例
【发布时间】:2023-03-13 09:01:01
【问题描述】:

两天前我遇到了懒惰关联的问题,但仍然没有找到这种行为的解释。 这是我简化的类层次结构:

@Entity
@Table(name="A")
public class A
{
    @Id
    @GeneratedValue
    @Column(name="ID")
    private int id;
    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
    private Set<B> listB = new HashSet<B>();
}

@Entity
@Table(name="B")
public class B
{
    @Id
    @GeneratedValue
    @Column(name="ID")
    private int id;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="A_ID")
    private A a;
    @ManyToOne(fetch=FetchType.LAZY)      // ERROR!
    // @ManyToOne(fetch=FetchType.EAGER)  // OK
    @JoinColumn(name="C_ID")
    private C c;
}

@Entity
@Table(name="C")
public class C {
    @Id
    @GeneratedValue
    @Column(name="ID")
    private int id; 
}

当我尝试从 db: A->B->C 读取简单结构时,我得到以下结果:

System.out.println(a.getId());                  // 1
for (B b : a.getListB()) {                      
    System.out.println(b.getId());              // 1
    C c = b.getC();
    System.out.println(c.getId());              // 0 !!!
}

如您所见,C 的实例未正确初始化。 将 B 类中字段 c 的提取类型从 LAZY 更改为 EAGER 后,一切正常!

我怀疑有一些 CGLIB 魔法,但在规范和 Google 中都找不到线索。 有人可以解释一下吗?

感谢您的帮助!!!

【问题讨论】:

    标签: java hibernate lazy-loading fetch


    【解决方案1】:

    如果您想了解延迟加载,请参阅answer;它很好地定义了它。

    【讨论】:

      【解决方案2】:

      已修复。我的问题不正确。对不起。 我的实体类的 getter 和 setter 有 final 修饰符。它打破了单值关联,例如多对一。 假设我错过了休眠日志中的一些警告...... 我认为在这种情况下最好通过休眠抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 2020-06-17
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多