2012-12-14 16 views
34

Po prostu chcę wiedzieć, jaka jest różnica między wszystkimi tymi adnotacjami. Dlaczego używamy tych ... oznacza, że ​​nie mają one wpływu, szczególnie na poziom pola i poziom właściwości.Jaki jest cel AccessType.FIELD, AccessType.PROPERTY i @Access

A jaki jest cel używania adnotacji mieszany poziom jak:

@Entity 
@Access(AccessType.FIELD) 
class Employee { 
    // why their is a field level access 
    private int id; 

    // whats the purpose of transient here 
    @Transient        
    private String phnnumber; 

    // why its a property level access 
    @Access(AccessType.property)    
    public String getPhnnumber() { 
     return "1234556"; 
    } 

} 

co dokładnie ta klasa mówi?

+0

Zobacz także doskonałe omówienie porównawcze: http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access – GKislin

Odpowiedz

48

Domyślnie typ dostępu określa miejsce, w którym umieszcza się adnotację identyfikatora (@Id). Jeśli umieścisz go na polu - będzie to AccessType.FIELD, jeśli umieścisz go na pobierającym - będzie to AccessType.PROPERTY.

Czasami warto opisywać nie pola, ale właściwości (np. Dlatego, że chcemy mieć dowolną logikę w pobierającym lub wolimy to w ten sposób.) W takiej sytuacji należy zdefiniować getter i opisać go jako AccessType.PROPERTY.

O ile pamiętam, jeśli podasz AccessType.FIELD lub AccessType.PROPERTY na dowolnym z pól/metod encji, musisz określić domyślne zachowanie dla całej klasy. I dlatego trzeba mieć AccessType.FIELD na poziomie klasy (pomimo tego AccessType.FIELD jest wartość domyślna).

Teraz, jeśli nie miałby @Transient na polu phnnumber WZP zapewni Ci tabeli 3 kolumny :

  • identyfikator,
  • phnnumber,
  • getphnnumber.

To dlatego, że byłoby to wykorzystać AccessType.FIELD dla wszystkich pól podmiotu (id i phnnumber), a jednocześnie, że to wykorzystać AccessType.PROPERTY dla getter (getPhnnumber()).
Koniec z numerem telefonu zmapowanym dwukrotnie w bazie danych.

Dlatego @Transient adnotacja jest wymagane - oznacza to, że jednostka nie będzie przechowywać wartość polaw podstawowej pamięci masowej, ale wartość zwracaną przez getter.

+10

Domyślnie nie jest FIELD. Typ dostępu to FIELD, jeśli umieścisz adnotacje mapowania na polach, a to WŁAŚCIWOŚĆ, jeśli umieścisz mapowania adnotacji na modułach pobierających. A cała hierarchia jednostek musi być spójna w rozmieszczaniu adnotacji mapowania: zawsze na polach lub zawsze na pobierających, ale nie mieszanych. –

+1

Masz rację - domyślne ustawienie zależy od tego, gdzie znajduje się adnotacja "@ Id". O miksowaniu - masz na myśli tylko adnotację id lub fakt, że nie możesz w ogóle mieszać dostępu do właściwości/pola w hierarchii jednostek? –

+3

Jeśli nie określono wyraźnie typu dostępu, specyfikacja JPA mówi, że wszystkie adnotacje mapowania w hierarchii muszą być umieszczone w polach lub w modułach pobierających. To, co dzieje się, jeśli nie przestrzegasz reguły, nie jest określone. Hibernate sprawdza gdzie znajduje się adnotacja Id, a jeśli jest na polu, ignoruje wszystkie adnotacje na pobierających (i na odwrót), ale jest to specyficzne dla Hibernacji. Zachowanie w takim przypadku jest nieokreślone (tak mówi spec). –