2012-12-24 13 views
5

Cosa devo modificare per evitare che Hibernate mi dia lazy proxy dell'istanza javassist piuttosto che la vera entità?come evitare di diventare javassist pigro istanze del proxy Entity in Hibernate

UPDATE: Sto usando 3.xe 4.x primavera e Hibernate

L'API che sto usando per caricare l'entità è org.hibernate.internal.SessionImpl#load(Person.class, Id) e la mappatura semplice:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.perfectjpattern.example.model"> 
<class name="Person" table="PERSON_" > 
    <id name="id"> 
     <generator class="native"></generator> 
    </id> 
    <property name="name" update="false" /> 
    <property name="age" update="true" /> 
</class> 

<query name="Person.findByName"> 
    <![CDATA[select p from Person p where p.name = ? ]]> 
</query> 

<query name="Person.findByAge"> 
    <![CDATA[select p from Person p where p.age = :Age ]]> 
</query> 
</hibernate-mapping> 
+2

Utilizzare il caricamento desideroso piuttosto che pigro. –

+0

Posso immaginare, ma che cosa esattamente e dove deve essere configurato, questo è l'OP –

+0

Se ci mostrate una delle entità mappate possiamo aiutarvi. –

risposta

0

realtà risolto semplicemente cambiando la mappatura (vedi la default-lazy="false"):

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.perfectjpattern.example.model" default-lazy="false"> 
+4

Questo è piuttosto pericoloso perché imposta tutte le entità e le raccolte in modo che non siano pigri, il che significa che potresti facilmente caricare l'intero database nella memoria per sbaglio. –

+0

Grazie per averlo presentato, tuttavia, come puoi notare nell'OP, ho una sola entità definita nella mia mappatura. Nel mio caso d'uso ho anche caricato un solo elemento (di Id). Se mantengo un progetto più ampio, ciascuna entità avrà il proprio file di mappatura in cui posso decidere quale dovrebbe essere la politica di caricamento. C'è anche l'altro lato della medaglia dove per diversi casi d'uso devo invocare "load' o" get ", non è una cosa buona dal punto di vista della riusabilità del codice. –

5

Usa get() piuttosto che load() .

+0

+1 per i dettagli extra, ma penso che 'load' sarebbe più flessibile in quanto in altri casi potrei scegliere di caricare pigro. Posso in questo modo configurarlo separatamente per ogni entità. –

+0

La tua applicazione dovrebbe scegliere quando andare a prendere le cose con entusiasmo e quando no. Cioè usa get() quando devi e carica() in qualsiasi altro momento. –

+0

Notate anche che se la vostra applicazione ha davvero bisogno di essere consapevole di questo, allora quasi sicuramente state facendo qualcosa di sbagliato. Il caricamento lento è progettato per essere trasparente. –

1

È possibile utilizzare Hibernate.initialize(obj) dopo session.load(id).

Questo metodo può inizializzare istantaneamente il tuo oggetto.

+0

... che è fondamentalmente una versione più complicata e più lenta di [utilizzando session.get()] (http://stackoverflow.com/a/14024110/839646). –

+0

puoi inizializzare il tuo obj quando hai richiesto piuttosto che inizializzarlo sempre. – ivivi

Problemi correlati