2012-04-09 9 views

risposta

5

Sì. È sufficiente annotare i campi/getter della proprietàper @Basic(fetch=FetchType.LAZY) e utilizzare questo ant task fornito dalla modalità di sospensione per eseguire la strumentazione bytecode per la classe di entità. In caso contrario, il caricamento di LAZY per la proprietà @Formula viene silenziosamente ignorato.

documentation contiene le informazioni su come utilizzare questa attività ant per eseguire la strumentazione bytecode.

+0

grazie per la tua risposta, che ne pensi di Maven? c'è un modo per ottenere questa cosa in "strumentazione bytecode" in Maven? Perché sto usando Maven e non ho niente a che fare con la formica. – destan

+0

puoi usare il plugin 'maven-antrun-plugin' che può eseguire compiti Ant all'interno di Maven. Vedere: http: //doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html –

+0

Strumentazione del codice in uso: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html –

2

Ho visto nel commento che si desidera ottenere ciò senza la strumentazione bytecode. Ciò può essere ottenuto implementando l'interfaccia FieldHandled e modificando getter e setter per il campo lazy.

HBM

<property name="deletable" type="true_false" lazy="true"> 
    <formula>(select something from other tables and such....)</formula> 
</property> 

JAVA

import org.hibernate.bytecode.javassist.FieldHandled; 
import org.hibernate.bytecode.javassist.FieldHandler; 
public class Person implements FieldHandled { 

/* allows lazy formulas without hibernate bytecode instrumentation */ 
private FieldHandler fieldHandler; 
public FieldHandler getFieldHandler() { return fieldHandler; } 
public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } 


private Boolean deletable; 

public void setDeletable(Boolean deletable) { 
    if(fieldHandler!=null) 
     fieldHandler.writeObject(this, "deletable", this.deletable, deletable); 
    this.deletable = deletable; 
} 

public Boolean getDeletable() { 
    if(fieldHandler!=null) 
     return (Boolean)fieldHandler.readObject(this, "deletable", deletable); 
    return deletable; 
} 
} 

Un altro esempio può essere trovato here. Ma questo è pigro che carica una relazione uno-a-uno.

+0

Ho provato la tua soluzione ma ho ottenuto un NPE su 'org.hibernate.engine.spi.EntityEntry.isUnequivocallyNonDirty (EntityEntry.java:314)' qualche idea? E quale versione di ibernazione hai usato? – Kakawait

+0

@Kakawait scusa non lo so esattamente. Ho scritto questo codice qualche tempo fa e credo che fosse 3.x (dove x è sconosciuto) – Danny

+0

Questo ha funzionato per me: non preoccuparti di usare il fieldHandler per il setter. È una formula non c'è nulla da impostare in DB – jpprade

Problemi correlati