2012-04-09 31 views

Respuesta

5

Sí. Simplemente anotando los campos/getter de la propiedad @Formula por @Basic(fetch=FetchType.LAZY) y usa esta ant task proporcionada por hibernate para hacer la instrumentación de bytecode para la clase de entidad. De lo contrario, la carga LAZY para la propiedad @Formula se ignora silenciosamente.

El documentation contiene la información sobre cómo usar esta tarea ant para hacer instrumentación de bytecode.

+0

gracias por su respuesta, ¿qué hay de maven? ¿Hay alguna manera de lograr esta cosa de "instrumentación bytecode" en maven? Porque estoy usando maven y no tengo nada que ver con la hormiga. – destan

+0

puede usar el complemento 'maven-antrun-plugin' que puede ejecutar tareas Ant en Maven. Ver: http: //doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html –

+0

Instrumentación de código de bytes en maven: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html –

2

Vi en el comentario que le gustaría lograr esto sin la instrumentación de bytecode. Esto se puede lograr implementando la interfaz FieldHandled y modificando los getters y setters para el campo flojo.

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

Otro ejemplo se puede encontrar here. Pero eso es perezoso al cargar una relación uno a uno.

+0

Intenté su solución, pero obtuve un NPE en 'org.hibernate.engine.spi.EntityEntry.isUnequivocallyNonDirty (EntityEntry.java:314)' alguna idea? ¿Y qué versión de hibernación usaste? – Kakawait

+0

@Kakawait lo siento, no sé exactamente. Escribí este código hace un tiempo y creo que era 3.x (donde x es desconocido) – Danny

+0

Esto funcionó para mí: no te molestes en utilizar el campo manejador para el colocador. Es una fórmula que no hay nada que establecer en DB – jpprade

Cuestiones relacionadas