繁体   English   中英

Hibernate LAZY获取不初始化实例

[英]Hibernate LAZY fetch not initializing an instance

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

@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类中将fetch类型从LAZY更改为EAGER后,一切正常!

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

谢谢你的帮助!!!

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

固定。 我的问题不正确。 抱歉。 我的权利类的getter和setter有最终修饰符。 它打破了像多对一那样的单值关联。 假设我在hibernate日志中错过了一些警告...我认为最好在这种情况下通过hibernate抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM