【发布时间】:2015-02-11 16:33:27
【问题描述】:
我在 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 为所有属性...我已经尝试直接对我的数据库进行上述查询,它会返回预期的数据。
我知道当我调用childClass.getParentClass()时Hibernate必须返回一个代理,但是为什么它之后从未初始化?
【问题讨论】:
-
“parentClassId”是数据库中的fk列名吗?
-
是的,在其他情况下映射工作正常......奇怪的是,这发生在我的大多数关系中
-
您是否在您的实体中使用了
final关键字? -
事实上——我愿意!现在我想我可以看到发生了什么——代理不能注入任何东西,因为它们不能覆盖 setter 方法,对吧?
-
是的,这就是我的想法。添加它作为答案。