2010-05-28 12 views
5

Mam pewne intuicyjne uczucie, że dodawanie pól, które nie są mapowane do DB, uszkadza klasy jednostek i jest złym sposobem rozwiązywania problemów.Mam wrażenie, że dodawanie pól oznaczonych adnotacją @Transient do encji jest bardzo podatne na błędy. Czy mam rację?

Ale czy są konkretne sytuacje, w których używanie pól @Transient prowadzi do ukrytych i trudnych problemów z utrwalaniem?

Na przykład, czy dodanie lub usunięcie pamięci podręcznej drugiego poziomu spowoduje przerwanie naszej aplikacji, gdy w naszych jednostkach są pola @Transient?

Znaczna zmiana: po pewnym myśleniu o @Transient dziedzinach wydaje mi się, że @Transient pola powinny być stosowane tylko w odpowiedni sposób.

Przez "właściwy sposób" rozumiem, że podmiot powinien zawsze mieć takie samo zachowanie. Oznacza to, że jest to zachowanie bardzo podatne na błędy, gdy gettery zwracają się od czasu do czasu w zależności od wartości pola @Transient. Oznacza to, że pola @Transient powinny zawsze być inicjowane.

I widzę tylko 2 przypadki prawidłowego wykorzystania:

  1. pola @Transient powinny zostać zainicjowane w konstruktorze obiektu:

    @Entity 
    public class SomeEntity 
        @Id 
        private long id; 
    
        @Transient 
        private String transientField; 
    
        public SomeEntity() { 
         transientField = "some string"; 
        }  
        ... 
    } 
    
  2. pola @Transient może być leniwy zainicjowany:

    @Entity 
    public class SomeEntity 
        @Id 
        private long id; 
    
        @Transient 
        private String transientField; 
    
        public String getTransientField() { 
         synchronized (lock) { 
         if (transientField == null) { 
          transientField = "some string"; 
         } 
         } 
         return transientField; 
        }  
        ... 
    } 
    

Czy ktoś może zgłaszać te 2 przypadki lub opisywać inne przypadki, które przeoczyłem?

+2

Kiedy mówisz "filozoficzny", masz na myśli "intuicyjny"? –

Odpowiedz

1

Używam adnotacji Transient w niektórych projektach, które są nadal hibernowane i nie napotkały jeszcze żadnych problemów.

Zazwyczaj jest używany dla pól, które mogą być określone przez inne trwałe właściwości i korzystanie z pamięci podręcznej powinno również działać, ponieważ mechanizmy szeregowania w języku Java (pamięci podręczne zwykle oczekują, że obiekty z pamięci podręcznej mogą być przekształcane do postaci szeregowej) uwzględniają również adnotację przejściową. Myślę, że najlepiej jest używać przejściowych właściwości getter i setter, które w miarę możliwości dostarczają informacji zamiast pól instancji.