2012-09-10 12 views
11

To pytanie jest zasadniczo przeciwieństwem this one.Jak dokonać hibernacji zignorować metodę?

Mam metodę tak:

public boolean isVacant() { 
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000"); 
} 

Kiedy załadować go, Hibernate narzeka, że ​​nie mam atrybut o nazwie vacant. Ale nie chcę atrybutu o nazwie vacant - Nie mam potrzeby przechowywania tych danych - to po prostu logika.

Hibernate mówi:

org.hibernate.PropertyNotFoundException: Nie można znaleźć setter dla mienia w pustej klasie com.mycomp.myclass ...

Czy istnieje adnotacja mogę dodać do mojej metody isVacant() uczynić Hibernate zignorować?

Odpowiedz

25

Dodaj @Transient metody następnie Hibernate należy go ignorować.

Cytując Hibernate Documentation się:

Każdy non non statyczną właściwość nieustalonych (pola lub metody w zależności od rodzaju dostępu) podmiotu jest uważane za trwałe, chyba że opisywanie go jako @Transient.

+0

Doh - Myślałem '@ Transient' tylko dla pól ... – corsiKa

3

RNJ jest poprawna, ale dodam, dlaczego tak się dzieje:

Zgaduję, że odnotowany przez pobierające swojej uporczywej klasie. Prefiksy używane przez komponenty bean java to "set" i "get", które są używane do odczytu i zapisu zmiennych, ale istnieje również przedrostek "is", który jest używany dla wartości logicznych (zamiast "get"). Kiedy Hibernacja widzi twoją adnotowaną przez gettera klasę uporczywą i znajduje metodę "isVacant", zakłada, że ​​istnieje własność "pusta" i zakłada, że ​​istnieje również "set" -metoda.

Tak więc, aby to naprawić, można też dodać @Transient adnotacji, czy można zmienić nazwę metody do czegoś, co nie zaczyna się „jest”. Nie sądzę, że byłby to problem, gdyby twoja klasa była opisana na polach, zamiast get-metod.

+3

Problem ze zmiana nazwy metody jest jednak to, że to też przerwy konwencji. Zgodnie z konwencją metody, które zwracają wartości logiczne (niezależnie od tego, czy są członkami) zaczynają się od, czy też nie. Rozważmy metodę 'java.util.Collection'' isEmpty() '- większość kolekcji nie zapisuje, czy są puste czy nie - porównują swój rozmiar do 0. (To nie jest prawda dla wszystkich kolekcji, na przykład' ConcurrentLinkedQueue' , ale jest tak dla większości, że 'AbstractCollection' implementuje go jako taki.) – corsiKa

Powiązane problemy