在JPA中对惰性对象进行奇怪的初始化

时间:2013-11-12 15:53:32

标签: java hibernate jsf jpa

好吧,我有一个名为“Consultation”的课程,其中有一个“ItemBudget”列表,我有一个名为“Budget”的课程,其中也有一个“ItemOrcamento”列表。关联咨询< - > ItemBudget是ManyToMany,关系Budget< - > ItemBudget是OneToMany。

在JSF中,我执行以下操作:

 <p:dataTable rowKey="#{item.id}" var="item" value="#{consultationMB.consultation.budget.itensAsList}" selection="#{consultationMB.itemBudget}" >

我使用方法“getItensAsList”返回一个ArrayList()而不是一个HashSet(),其中primefaces dataTable标签无法正确读取

如您所见,我的选择是“itemBudget”,因此在我的ManagedBean中调用了ConsultationMBImpl,我尝试执行以下操作:

 if (!itemBudget.getSituation().getCode().equals("WAITING_CONCLUSION")){
    //some code here
 }

当我尝试在所有引用另一个类的字段上面创建代码时:情境,牙医和其他人都有:“Dentist_javassist_32”,“Situation_javassist_49”...... 并且所有字段都为null或零。

1 个答案:

答案 0 :(得分:3)

这是由 Hibernate 引起的,它加载代理(后缀为_javassist)而不是原始对象。如果您使用IDE调试代码并尝试动态调用getter,您将获得实际值,即使该属性似乎为null

为什么这样做?因为加载代理而不是ORM工具的真实对象要快得多。 Hibernate keeps a cache已经加载了对象,而不是一次又一次地命中DB。

如果你想避免延迟加载,你可以使用get而不是load方法而不是Hibernate的Session。同样对于它的关系,你可以将它们标记为lazy="false",因此Hibernate会将它们作为真实对象加载。如果您想直接取消已经加载的实例的代理,那么还需要some methods来实现它。

但是,除非您严格要求,否则不要这样做。正如我之前所说,这将使Hibernate从DB加载更多信息,从而导致效率低下。