2012-01-20 9 views
5

Sto usando Hibernate JPA con e hanno un rapporto che assomiglia a questo:JPA/Hibernate proxy non il recupero dei dati oggetto reale, imposta tutte le proprietà su null

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

Da quando ho iniziato ad usare il LAZY tipo di recuperare, ogni volta che cerco di ottenere il proprietario di una matita (pencil.getOwner) Ottengo un oggetto non null che ha tutte le sue proprietà interne impostate su null.

Mi sembra che il proxy creato da Hibernate non recuperi l'oggetto reale dal database quando dovrebbe.

Qualche idea? Grazie :)

+4

Stai chiamando i getter e ottieni nulla? O stai ispezionando l'oggetto in un debugger? Se il primo, prova a rimuovere il modificatore finale sui getter. Se quest'ultimo, prova in realtà a chiamare i Getter. –

+0

Vedere anche http://blog.bolkey.com/2009/05/hibernate-datanucleus-r1/ – DataNucleus

risposta

2

Come suggerito JB Nizet, il finale modificatore getter mie classi stato scherzi con il proxy vanno in letargo crea per le relazioni caricate pigro.

5

Questo è semplicemente il modo in cui Hibernate implementa il caricamento pigro. Ti darà un oggetto proxy invece di un'istanza della tua classe entità. Quando si dice

un oggetto non nullo che ha tutte le sue proprietà interne impostato su NULL

che è probabilmente quello che hai visto in un debugger, giusto? Non devi preoccuparti di questo, una volta che accedi a una di queste proprietà tramite codice o tramite una chiamata all'interno del debugger, Hibernate caricherà i dati dal DB in background, costruirà un'istanza della tua classe entità e tutte le chiamate a l'oggetto proxy sarà delegato in modo trasparente all'entità reale. Così normalmente, e idealmente non devi preoccuparti della distinzione del proxy di Hibernate < -> oggetto entità.

mi viene in mente due ragioni di essere a conoscenza di tale distinzione in ogni caso:

  1. prestazioni: quando si accede gli elementi di una collezione pigramente caricato in un ciclo, lazy loading può realmente rallentare l'app
  2. Ereditarietà: se il modello di dati utilizza l'ereditarietà, fare molta attenzione con instanceof e cast. Leggi this SO question su come verificare se un oggetto è un proxy Hibernate e come convertirlo l'oggetto reale entità
+2

Grazie Robert. Il problema qui è che il proxy in realtà non sta facendo quello che dovrebbe fare. Le chiamate ai getter del proxy restituiscono null. – juanedi

Problemi correlati