好吧,我有一个名为“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或零。
答案 0 :(得分:3)
这是由 Hibernate 引起的,它加载代理(后缀为_javassist
)而不是原始对象。如果您使用IDE调试代码并尝试动态调用getter,您将获得实际值,即使该属性似乎为null
。
为什么这样做?因为加载代理而不是ORM工具的真实对象要快得多。 Hibernate keeps a cache已经加载了对象,而不是一次又一次地命中DB。
如果你想避免延迟加载,你可以使用get
而不是load
方法而不是Hibernate的Session。同样对于它的关系,你可以将它们标记为lazy="false"
,因此Hibernate会将它们作为真实对象加载。如果您想直接取消已经加载的实例的代理,那么还需要some methods来实现它。
但是,除非您严格要求,否则不要这样做。正如我之前所说,这将使Hibernate从DB加载更多信息,从而导致效率低下。