Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate惰性获取不初始化实例_Java_Hibernate_Lazy Loading_Fetch - Fatal编程技术网

Java Hibernate惰性获取不初始化实例

Java Hibernate惰性获取不初始化实例,java,hibernate,lazy-loading,fetch,Java,Hibernate,Lazy Loading,Fetch,两天前,我遇到了一个关于懒惰联想的问题,至今还没有找到这种行为的解释。 以下是我的简化类层次结构: @Entity @Table(name="A") public class A { @Id @GeneratedValue @Column(name="ID") private int id; @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=CascadeType.ALL) privat

两天前,我遇到了一个关于懒惰联想的问题,至今还没有找到这种行为的解释。 以下是我的简化类层次结构:

@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; 
}
正如您所看到的,C的实例没有正确初始化。 在类B中将fetch类型从LAZY更改为渴望字段c之后,一切都正常

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


谢谢你的帮助

如果您想了解延迟加载,请参见此;它定义得很好。

已修复。我的问题不对。很抱歉 我的实体类的getter和setter有最后一个修饰符。它打破了单值关联,就像多对一。 假设我错过了hibernate日志中的一些警告。。。 我认为对于这种情况,最好通过hibernate抛出一个异常

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 !!!
}