2012-04-09 16 views

Antwort

5

Ja. Markieren Sie einfach die Felder/Getter der @Formula-Eigenschaft mit @Basic(fetch=FetchType.LAZY), und verwenden Sie diese ant task, die von Hibernate bereitgestellt wird, um die Bytecode-Instrumentierung für die Entitätsklasse auszuführen. Andernfalls wird LAZY beim Laden der Eigenschaft @Formula stillschweigend ignoriert.

Die documentation enthält die Informationen darüber, wie diese ant-Task für die Bytecode-Instrumentierung verwendet wird.

+0

danke für deine antwort, was ist mit maven? Gibt es eine Möglichkeit, diese "Bytecode Instrumentierung" Sache in Maven zu erreichen? Weil ich Maven benutze und nichts mit Ameisen zu tun habe. – destan

+0

können Sie 'maven-antrun-plugin'-Plugin verwenden, das Ant-Aufgaben innerhalb von Maven ausführen kann. Siehe: http://doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html –

+0

Bytecode Instrumentierung in maven: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html –

2

Ich sah in dem Kommentar, dass Sie dies ohne Bytecode Instrumentierung erreichen möchten. Dies kann durch Implementieren der Schnittstelle FieldHandled und durch Modifizieren der Getter und Setter für das Lazy-Feld erreicht werden.

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; 
} 
} 

Ein weiteres Beispiel kann here finden. Aber das ist faul laden eine Eins-zu-Eins-Beziehung.

+0

Ich habe Ihre Lösung versucht, aber ich habe eine NPE auf 'org.hibernate.engine.spi.EntityEntry.isUnequivocallyNonDirty (EntityEntry.java:314)' eine Idee? Und welche Hibernate-Version hast du benutzt? – Kakawait

+0

@Kakawait Entschuldigung, weiß ich nicht genau. Ich schrieb diesen Code eine Weile zurück und glaube, dass es 3.x war (wobei x unbekannt ist) – Danny

+0

Das funktionierte für mich: nicht die Verwendung des fieldHandler für den Setter. Es ist eine Formel, es gibt nichts zu setzen in DB – jpprade

Verwandte Themen