2011-12-28 12 views
5

Załóżmy, że mam User podmiot takiego:Czy właściwości odwzorowane w pliku hbm.xml mogą być przejściowe?

class User { 
    private String login; 
    transient private String hashedPassword; 
} 

nie chcę, aby kiedykolwiek przenieść hashedPassword do klientów, więc robię to przemijające.

Ta klasa jest odwzorowywana przez Hibernate, przy czym oba pola są odwzorowane w pliku hbm.xml.

Czy ta implementacja jest bezpieczna i poprawna? Czy Hibernate poprawnie przechowuje hashedPassword w bazie danych, ładuje je do obiektów z bazy danych, zachowuje je w replikowanej pamięci podręcznej drugiego poziomu i lokalnej pamięci podręcznej sesji itp?

W słowach, czy Hibernate lub cache drugiego poziomu szacunek transient w jakikolwiek sposób lub całkowicie go ignorować?

EDYTOWANIE: Otrzymałem już dwie odpowiedzi, które nie zawierały jednego konkretnego aspektu równania. W ogóle nie używam adnotacji, tylko odwzorowania XML w hbm.xml. I to pole przejściowe Java jest mapowane na OR w hbm.xml.

Odpowiedz

3

Wygląda na to, że Hibernacja nie utrwala pola ze słowem kluczowym transient, niezależnie od tego, jakie masz inne adnotacje.

Oddzielny @Transient adnotacja pozwoli skierować Hibernate ignorować zakaz przemijające pole dla trwałości, ale nie sądzę, że to możliwe, aby zrobić odwrotnie posiadania Hibernate ustępują pola transient.

Podobny dyskusja tutaj:

JPA - using annotations in a model

Annotation @Basic to transient variables

Najbardziej istotne cytat za pośrednictwem wyżej, z JPA 2.0 Spec: „adnotacje Mapowanie nie może być stosowany na pola lub właściwości, które są transient lub @Transient . "

+0

Dziękuję, ale szczególnie wspomniałem, że pole jest mapowane w pliku hbm.xml. W ogóle nie wzywam adnotacji. –

+0

Czy Hibernacja rzeczywiście odwzorowuje właściwość w takim przypadku? Zakładałem, że adnotacje i plik hbm.xml zachowują się tak samo, ale być może tak nie jest. Ponieważ 'transient' zapewnia, że ​​właściwość nie jest serializowana, czy twoje pytanie dotyczy wyłącznie zachowania Hibernacji? – wrschneider

7

Właściwości niemapowane/przejściowe nie są zapisywane przez hibernację.

Hibernacja rozumie znaczenie standardowych przejściowych modyfikatorów java - ale także pozwala na przypisywanie właściwości jako przejściowych za pomocą adnotacji @Transient, jeśli tak zdecydujesz ... Lub po prostu całkowicie opuść pole z pliku odwzorowania.

W twoim przypadku prawdopodobnie NIE będziesz potrzebował robić nic specjalnego, hibernacja powinna po prostu "robić to, co trzeba", ignorując niezmapowane pola.

Więc: lekcja dowiedziałem tutaj -

Jeśli tylko przy użyciu hbm.xml

1) właściwości unmapped nie są zapisywane przez hibernacji - są skutecznie przemijające.

jeśli używasz POJOs

2) Hibernate zignoruje saving "@Transient" adnotacjami zmienne:

@Transient 
int ignored=0; 

3) Hibernate będzie również ignorowanych zapisywanie zmiennych ze standardowych "przejściowych" modyfikatory:

private transient int ignored =0; 

Zapoznaj się z http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/, aby uzyskać doskonałe wyjaśnienie tego.

+0

Dziękuję, ale specjalnie wspomniałem, że pole jest mapowane w hbm.xml. W ogóle nie wzywam adnotacji. –

+0

Tak, to prawda - adnotacja POJO jest nieistotna. Dodałem punktor, aby odpowiedzieć na twoje pytanie. W każdym razie - to proste, po prostu zostaw zmienną poza mapą - a hibernacja będzie wyglądać inaczej. Żadne zapisywanie ani buforowanie nie zostanie wykonane, ponieważ "mapa" hibernacji twojego obiektu nie będzie zawierała zmiennej niezmapowanej. – jayunit100

+0

Dzięki Jay, ale mój punkt widzenia jest całkiem odwrotny. Pytam, czy jest to zawsze bezpieczne, druga pamięć podręczna lv i co tam, aby mieć przejściowe pole POJO zmapowane za pomocą hbm.xml. –

0

Oto, co myślę - Hibernate to po prostu technologia mapowania. Kiedy oznaczysz pole jako TRANSIENT, nie będzie ono utrzymywane przez java. A ponieważ jego stan nie jest utrzymywany, dlaczego hibernacja powinna go utrzymywać w pamięci podręcznej L2, itp.? więc hibernacja nie powinna sprawiać problemu, nawet jeśli mapujesz pole przejściowe w pliku hbm.

Powiązane problemy