2012-01-20 9 views
5

estoy usando Hibernate con APP y tener una relación que tiene este aspecto:JPA/Hibernate proxy no ir a buscar datos de objetos reales, establece todas las propiedades en nulo

public class PencilImpl implements Pencil { 

    @ManyToOne(targetEntity = PersonImpl.class, fetch = FetchType.LAZY) 
    @JoinColumn(name = "owner", nullable = false) 
    private Person owner; 

    ... 

    @Override 
    public final Person getOwner() { 
     return owner; 
    } 
} 

Desde que empecé a usar los perezosos traiga tipo, cada vez que trato de obtener el propietario de un lápiz (pencil.getOwner) Obtengo un objeto no nulo que tiene todas sus propiedades internas establecidas en nulo.

Parece que el proxy creado por Hibernate no está obteniendo el objeto real de la base de datos cuando debería.

¿Alguna idea? Gracias :)

+4

¿Estás llamando a los getters y obteniendo nulo? ¿O está inspeccionando el objeto en un depurador? Si el primero, intente eliminar el modificador final en sus getters. Si es el último, intente realmente llamar a getters. –

+0

Véase también http://blog.bolkey.com/2009/05/hibernate-datanucleus-r1/ – DataNucleus

Respuesta

2

Como sugirió JB Nizet, la última modificador de captadores mis clases estaba jugando con los proxies de hibernación crea para relaciones cargadas perezosas.

5

Así es como Hibernate implementa la carga diferida. Le dará un objeto proxy en lugar de una instancia de su clase de entidad. Cuando usted dice

un objeto no nulo que tiene todas sus propiedades internas establecidas en nulo

que es probablemente lo que viste en un depurador, ¿verdad? No tiene que preocuparse por eso, una vez que accede a cualquiera de esas propiedades por código o mediante una llamada dentro del depurador, Hibernate cargará los datos del DB en segundo plano, construirá una instancia de su clase de entidad y todas las llamadas a el objeto proxy se delegará de forma transparente a la entidad real. Por lo general, e idealmente no tiene que preocuparse por la distinción Hibernate proxy < -> entity object.

me ocurren dos razones a tener en cuenta esa distinción de todos modos:

  1. Rendimiento: cuando accede a los elementos de una colección cargados de forma liviana en un bucle, la carga diferida realmente puede ralentizar su aplicación
  2. Herencia: si su modelo de datos usa herencia, tenga mucho cuidado con instanceof y yesos. Leer this SO question sobre cómo comprobar si un objeto es un proxy Hibernate y cómo convertirlo en el objeto entidad real
+2

Gracias Robert. El problema aquí es que el proxy en realidad no está haciendo lo que se supone que debe hacer. Las llamadas a los getters del proxy devuelven null. – juanedi

Cuestiones relacionadas