2012-05-16 14 views
5

Estoy usando spring 3.0.6, jpa 2.0, hibernate 3.6.8. Mi pregunta es, ¿en qué situaciones se usa javassist para crear un "proxy" para un EntityClass? ¿Y cuál es la razón de este proxy? Tengo el siguiente Entidad:¿Cuándo se han mejorado las clases y para qué? jpa, spring, hibernate, javassist

@Entity 
public MyEntity{ 
.. 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "adresseID") 
    private Adresse adresse; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "myEntity") 
    private List<Parameter> parameters; 

.. 
} 

Cuando cargo un myEntity de db, la clase de entidad es algo así como myEntity __ $$ _ javassist. ¿Por qué está hecho? ¿Para qué? Creo que solo la clase regular MyEntity se puede usar aquí.

Para poner en práctica la carga diferida, podemos:

  • para @OneToMany - PersistenceBag puede usar aquí
  • para @ManyToOne - aquí se debe utilizar "enchancedClass" como Adress_ $$ _javassist

Entonces, ¿cuál es la razón para mejorar MyEntity? ¿Dónde puedo leer algo más al respecto? ¿Qué libro/artículo/blog me puedes recomendar?

Respuesta

4

La razón principal por la que se mejoran las clases de entidad es que JPA (o Hibernate) necesita rastrear el estado de los objetos de la entidad.

En particular, JPA debe saber si el campo de entidad dado es "sucio" - fue modificado por el usuario, pero este cambio aún no se refleja en la base de datos, por lo que JPA debe sincronizarlo con la base de datos.

El otro caso es el estado "cargado" del campo de entidad. Cualquier campo puede asignarse para ser cargado de forma diferida. Cuando dicho campo está a punto de ser utilizado, JPA debe saber que la consulta de la base de datos se debe realizar para inicializar el valor de ese campo.

El valor predeterminado de Hibernate es utilizar la mejora del tiempo de ejecución: el proxy es solo una subclase de la entidad con elementos adicionales añadidos.

Algunas ideas generales se describen here.

Cuestiones relacionadas