2010-01-07 16 views
85

Pytanie znajduje się w tytule. Poniżej przedstawiłem niektóre z moich myśli i ustaleń.Kiedy i dlaczego jednostki JPA powinny implementować interfejs Serializable?

Kiedy miałem bardzo prosty model domeny (3 tabele bez żadnych powiązań) wszystkie moje podmioty NIE implementowały Serializable.

Ale kiedy model domeny stał się bardziej złożony, otrzymałem RuntimeException, który stwierdził, że jedna z moich jednostek nie implementowała Serializable.

Używam Hibernate jako implementacji JPA.

zastanawiam:

  1. Czy sprzedawca specyficzne wymaganie/zachowanie?
  2. Co stanie się z moimi obiektami serializowanymi? Czy należy je szeregować do przechowywania lub do przenoszenia?
  3. W którym momencie konieczne staje się uczynienie mojej jednostki serializowalną?

Odpowiedz

33

Zwykle dzieje się tak, gdy miesza się HQL i natywne zapytania SQL. W HQL Hibernate odwzorowuje typy, które przekazujesz, do czego DB rozumie. Kiedy uruchamiasz natywny SQL, musisz sam wykonać mapowanie. Jeśli nie, domyślnym mapowaniem jest serializowanie parametru i wysłanie go do bazy danych (w nadziei, że to zrozumie).

34

potrzebny podmioty być Serializable jeśli trzeba przenieść je over-the-wire (szeregować je do innej reprezentacji), należy przechowywać je w sesji HTTP (który jest z kolei w odcinkach na dysku twardym przez serwlet kontener), itp.

Tylko ze względu na trwałość, Serializable nie jest potrzebna, przynajmniej z Hibernate. Najlepszą praktyką jest jednak ich wykonanie Serializable.

+2

Nie wiem, może moje istoty są przenoszone gdzieś w sposób dorozumiany. Używam hibernacji + sprężyny + jsf i Tomcat. Gdzie w tym łańcuchu może nastąpić przeniesienie? – Roman

4

Klasy muszą implementować Serializowalne, jeśli chcesz je przekształcić do postaci szeregowej. Nie jest to bezpośrednio związane z JPA, a specyfikacja JPA nie wymaga, aby jednostki były przekształcalne do postaci szeregowej. Jeśli Hibernate naprawdę na to narzeka, to przypuszczam, że jest to błąd Hibernate, ale przypuszczam, że bezpośrednio lub pośrednio robisz coś innego z obiektami, które wymagają ich serializacji.

92

Według JPA Spec:

Jeżeli przykład jednostka ma być przekazywane przez wartość jako wolnostojący przedmiotu (na przykład, poprzez interfejs zdalnego), klasa jednostka musi realizować interfejs Serializable.

"JSR 220: Przedsiębiorstwo JavaBeansTM, wersja 3.0 Java Persistence API Wersja 3.0 Final Release 02 maja 2006"

+11

(+1) patrząc na specyfikację jest zawsze owocny – Bozho

+9

Nie rozumiem, dlaczego ma tak wiele przebojów. OP mówi, że nie był wymagany, gdy model był prostszy. Wysyłanie obiektów zdalnie za pomocą serializacji Java będzie ZAWSZE wymagać, aby obiekty były Serializowalne, niezależnie od ich złożoności. Oczywiście nie jest to przypadek użycia PO. – Robin

+0

Nie jestem do końca pewien na temat hibernacji, ale w przypadku innych dostawców JPA istnieją operacje, które wymagają od dostawcy utworzenia kopii obiektu (obiektu). "Serializable" może być pomocne w tym, a w kontekście trwałości bardziej spójne niż "Cloneable" na przykład. – JimmyB

4

wierzę, problem związany jest z konieczności pola złożonego typu (klasy), które nie jest adnotowane. W takich przypadkach manipulacja domyślnego będzie przechowywać obiekt w to forma odcinkach w bazie danych (które prawdopodobnie nie jest to, co masz na myśli to zrobić) Przykład:

Class CustomerData { 
    int getAge(); 
    void setAge(int age); 
} 

@Entity 
Class Customer { 
    CustomerData getCustomerData(); 
    void setCustomerData(CustomerData data) 
} 

W powyższym przypadku CustomerData zostanie zapisany w pole tablicy bajtów w bazie danych w postaci szeregowej.

8

W celu uzupełnienia miłej odpowiedzi Conora, który odniósł się do specyfikacji JSR-317. Zazwyczaj projekty EAR składają się z modułu EJB z EJB wyeksponowanymi za pomocą zdalnego interfejsu. W tym jednym przypadku konieczne jest przekształcenie fasoli encji w obiekt, ponieważ są one agregowane w zdalnym komponencie EJB i są zbudowane tak, aby można je było łączyć z siecią.

Projekt wojenny JEE6 bez CDI: może zawierać EJB lite wspierane przez nie nadające się do serializacji podmioty JPA.

Projekt wojenny JEE6 z CDI: Beans that use session, application, or conversation scope must be serializable, but beans that use request scope do not have to be serializable. W związku z tym podstawowe fasole encji JPA - if any- would going to the same semantyka.

1

Według hibernate docs, podczas korzystania @JoinColumn adnotacji:

ma jeden więcej parametrów nazwie referencedColumnName. Ten parametr deklaruje kolumnę w docelowym elemencie, który będzie używany do łączenia. Zwróć uwagę, że przy korzystaniu z kolumny referencedColumnName do kolumny klucza niepochodzącego, powiązana klasa musi być Serializable.

0

Jest to również błąd, który jest generowany, gdy mijamy się niepoprawnie wpisany identyfikator jako drugi param do czegoś jak em.find() (tj przekazując samą jednostkę, a nie jego ID). Nie znalazłem jeszcze niezbędnego do zadeklarowania jednostek WZP nadających się do serializacji - nie jest to naprawdę konieczne, chyba że używasz metody nazwanej, która została opisana przez aman.

0

Zdalne uderzenie za pomocą listonosza lub ajaxa lub kanciastego js itd ....., może spowodować powtarzanie cyklu z wyjątkiem StackOverflow z Jackson szybciejxml. Więc lepiej jest użyć serializera.

Powiązane problemy