我在Hibernate中有这样的映射(通过JPA,使用EntityManager等):
public ChildClass {
....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentClassId")
private ParentClass parentClass;
....
}
包含ChildClass
元素列表的父类:
public ParentClass {
...
@OneToMany(mappedBy = "parentClass", fetch = FetchType.LAZY)
private List<ChildClass> childElements;
...
}
现在我的服务层中有这个方法:
@Transactional
public ChildClassDTO consultarPuntuacionPrueba(Long parentClassId) {
ChildClass result= childClassDAO.getChildClassByParentId(parentClassId);
ParentClass parentClass = result.getParentClass();
System.out.println("UNITIALIZED: " + ((HibernateProxy)prueba).getHibernateLazyInitializer().isUninitialized());
Long parentClassId = parentClass.getParentClassId();
Boolean anAttribute = parentClass.getBooleanAttribute();
return map(result, ChildClassDTO.class);
}
问题是 - parentClass是一个javassist代理,即使在访问parentClass
的getter时,我可以看到一个查询被执行(它在我的控制台中显示),代理永远不会被初始化并保持对于所有属性都为null ...我已经直接向我的数据库尝试了查询,并返回了预期的数据。
我知道Hibernate在调用childClass.getParentClass()
时必须返回代理,但为什么以后它永远不会被初始化?
答案 0 :(得分:2)
请确保您的实体getter和setter不使用final
关键字,否则代理将无法覆盖这些方法,并且可能无法正常运行。
答案 1 :(得分:0)
正如您在映射中定义的那样,Hibernate会懒惰地加载映射的实体。这意味着映射实体仅在您访问时加载(否则您只有一个代理实例)。因此,如果您希望映射的实体被急切加载(没有代理),您可以将FetchType更改为EAGER