Hibernate懒加载无法初始化实例

4
我两天前遇到了一个懒惰关联的问题,至今还没有找到这种行为的解释。以下是我简化后的类层次结构:
@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; 
}

当我尝试从数据库读取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的魔法,但是在规范和谷歌上都找不到任何线索。有人能解释一下吗?

非常感谢任何帮助!!!

2个回答

1
如果您希望了解 lazy loading,请参考 answer;它很好地定义了它。

0

问题已经解决。我的问题描述不正确,非常抱歉。 我的实体类的getter和setter方法中使用了final修饰符,这破坏了类似多对一的单值关联。 可能我在hibernate日志中错过了一些警告信息…… 我认为最好由hibernate抛出异常处理这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接