簡體   English   中英

JPA中惰性對象的奇怪初始化

[英]Strange initialization of lazy object in JPA

好吧,我有一個名為“ Consultation”的類,該類具有一個“ ItemBudget”的列表,而我也有一個名為“ Budget”的類,該類也具有一個“ ItemOrcamento”的列表。 關系Consultation <-> ItemBudget為ManyToMany,關系Budget <-> ItemBudget為OneToMany。

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

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

我使用方法“ getItensAsList”返回的是ArrayList()而不是不能正確讀取primefaces dataTable標記的HashSet()

如您所見,我的選擇是“ itemBudget”,因此在名為ConsultationMBImpl的ManagedBean中,我嘗試執行以下命令:

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

當我嘗試將代碼引用到引用了另一個類的所有字段之上時,例如:現狀,牙醫和其他人具有以下代碼:“ Dentist_javassist_32”,“ Situation_javassist_49” ...並且所有字段均為null或零。

這是由Hibernate引起的,它加載了一個代理(后綴_javassist )而不是原始對象。 如果您使用IDE調試代碼並嘗試快速調用getter,您將獲得實際值,即使該屬性似乎為null

為什么這樣做? 因為對於ORM工具而言,加載代理要比加載真實對象快得多。 Hibernate使用已加載的對象保留緩存 ,而不是一次又一次地訪問數據庫。

如果要避免延遲加載,可以在Hibernate的Session上使用get而不是load方法。 同樣由於其關系,您可以將它們標記為lazy="false" ,因此Hibernate會將它們加載為真實對象。 如果要直接取消代理已加載的實例,也可以使用一些方法來實現。

但是,除非嚴格要求,否則請不要這樣做。 就像我之前說過的那樣,這將使Hibernate從數據庫中加載更多的信息,從而降低效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM