0

Well, i have class named "Consultation" that have a list of "ItemBudget", and i have a class named "Budget" that have a list of "ItemOrcamento" too. The relation Consultation<-->ItemBudget is ManyToMany, and relation Budget<-->ItemBudget is OneToMany.

In JSF i do the following:

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

I use method "getItensAsList" that return a ArrayList() instead of a HashSet() that primefaces dataTable tag can't read correctly

As you can see, my selection is "itemBudget", so in my ManagedBean called ConsultationMBImpl i try to execute the following:

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

When i try make the code above all fields that have reference to another class like: Situation, Dentist and others have this: "Dentist_javassist_32", "Situation_javassist_49"... And all fields are null or zero.

4

1 に答える 1

3

これは、元のオブジェクトの代わりにプロキシ (サフィックスが付いたもの) をロードするHibernateが原因です。_javassistIDE を使用してコードをデバッグし、その場で getter を呼び出そうとすると、プロパティのように見えても実際の値が得られnullます。

なぜそれが行われるのですか?ORM ツールでは、実際のオブジェクトよりもプロキシをロードする方がはるかに高速だからです。Hibernateは、DB に何度もアクセスする代わりに、既にロードされたオブジェクトでキャッシュを保持します。

遅延読み込みを回避したい場合は、Hibernate のセッションでメソッドのget代わりに a を使用できます。loadまた、その関係については、それらを としてマークできるlazy="false"ため、Hibernate はそれらを実際のオブジェクトとしてロードします。すでにロードされているインスタンスのプロキシを直接解除したい場合は、それを実現する方法もいくつかあります。

ただし、厳密に必要な場合を除き、これを行わないでください。前に述べたように、これにより Hibernate が DB からより多くの情報をロードし、その結果、効率が低下します。

于 2013-11-12T16:59:44.517 に答える