2012-01-20 11 views
5

używam hibernacji z JPA i mieć związek, który wygląda tak:JPA/Hibernate proxy nie pobierania danych rzeczywistych obiektów, ustawia wszystkie właściwości 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; 
    } 
} 

Odkąd zacząłem używać leniwy pobrać typ, za każdym razem, gdy próbuję zdobyć właściciela ołówka (pencil.getOwner) Otrzymuję obiekt niezerowy, który ma wszystkie wewnętrzne właściwości ustawione na wartość null.

Wygląda na to, że proxy utworzone przez Hibernate nie pobiera rzeczywistego obiektu z bazy danych, kiedy powinien.

Wszelkie pomysły? Dzięki :)

+4

Czy wywołujesz gettery i otrzymujesz wartość null? A może sprawdzasz obiekt w debugerze? W pierwszym przypadku spróbuj usunąć ostateczny modyfikator w swoich procesach. Jeśli to drugie, spróbuj wywoływać gettery. –

+0

Zobacz także http://blog.bolkey.com/2009/05/hibernate-datanucleus-r1/ – DataNucleus

Odpowiedz

2

jak sugeruje JB Nizet The końcowy modyfikator w pobierające moich klas był brudząc z pełnomocnicy hibernacji tworzy dla leniwych załadowanych relacji.

5

Jest to po prostu sposób, w jaki Hibernate wdraża leniwy ładowanie. Da ci obiekt proxy zamiast instancji twojej klasy encji. Kiedy mówisz

niepusta obiektu, który ma wszystkich jego właściwości wewnętrzne ustawione na null

to jest chyba to, co widzieliśmy w debuggera, prawda? Nie musisz się tym martwić, gdy uzyskasz dostęp do którejś z tych właściwości za pośrednictwem kodu lub połączenia wewnątrz debuggera, Hibernate załaduje dane z DB w tle, skonstruuje instancję klasy encji i wszystkie wywołania do obiekt proxy zostanie przekazany w sposób przezroczysty do faktycznego podmiotu. Zwykle, i najlepiej nie musisz się martwić o wyróżnienie Hibernate proxy < -> obiekt entity.

mogę myśleć o dwóch powodów, aby zdawać sobie sprawę z tego rozróżnienia w każdym razie:

  1. Osiągi: podczas korzystania z elementy leniwie załadowanego kolekcji w pętli, leniwy ładowanie może naprawdę spowolnić aplikację
  2. Dziedziczenie: jeśli twój model danych korzysta z dziedziczenia, bądź ostrożny z instanceof i rzutowaniem. Czytaj this SO question, w jaki sposób sprawdzić, czy obiekt jest proxy Hibernate i jak konwertować go do obiektu rzeczywistego podmiotu
+2

Dziękuję Robert. Problem polega na tym, że proxy wcale nie robi tego, co powinno. Połączenia z serwerami proxy zwracają wartość null. – juanedi