2012-04-09 12 views

Odpowiedz

5

Tak. Po prostu dodawanie adnotacji do pól/getter właściwości @Formula przez @Basic(fetch=FetchType.LAZY) i użycie tego ant task dostarczonego przez hibernację w celu wykonania oprzyrządowania kodu bajtowego dla klasy encji. W przeciwnym razie LAZY ładowanie dla właściwości @Formula jest dyskretnie ignorowane.

Urządzenie documentation zawiera informacje o tym, jak korzystać z tego zadania ant, aby wykonać oprzyrządowanie bajtode.

+0

dzięki za odpowiedź, co z mavenem? czy istnieje sposób na osiągnięcie tego "instrumentarium bajtowego" w maven? Ponieważ używam maven i nie mam nic wspólnego z mrówką. – destan

+0

można użyć wtyczki 'maven-antrun-plugin', która może uruchamiać zadania Ant w obrębie Maven. Zobacz: http: //doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html –

+0

Oprzyrządowanie Bytecode w maven: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html –

2

Widziałem w komentarzu, że chciałbyś to osiągnąć bez oprzyrządowania bajtodemu. Można to osiągnąć poprzez implementację interfejsu FieldHandled i przez modyfikację modułów pobierających i ustawiających dla pola leniwego.

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

Inny przykład można znaleźć here. Ale to jest leniwe ładowanie relacji jeden-do-jednego.

+0

Próbowałem Twojego rozwiązania, ale dostałem NPE na 'org.hibernate.engine.spi.EntityEntry.isUnequivocallyNonDirty (EntityEntry.java:314)' jakiś pomysł? I z której wersji hibernacji korzystałeś? – Kakawait

+0

@Kakawait przepraszam, nie wiem dokładnie. Napisałem ten kod jakiś czas temu i sądzę, że był to 3.x (gdzie x jest nieznany). – Danny

+0

To działało dla mnie: nie zawracaj sobie głowy używaniem funkcji fieldHandler dla setera. Jest to formuła, której nie da się ustawić w DB – jpprade

Powiązane problemy