Kiedy i dlaczego jednostki JPA powinny implementować interfejs Serializowalny?

Pytanie jest w tytule. Poniżej właśnie opisałem niektóre z moich przemyśleń i ustaleń.

Kiedy miałem bardzo prosty model domeny (3 tabele bez żadnych relacji), wszystkie moje encje Nie implementowały Serializowalnego.

Ale kiedy model domeny stał się bardziej złożony, dostałem RuntimeException, który powiedział, że jeden z moich podmiotów nie zaimplementował Serializowalnego.

Używam Hibernate jako implementacji JPA.

Zastanawiam się:

  1. czy jest to specyficzne dla dostawcy wymagania / zachowanie?
  2. co się dzieje z moimi serializowanymi bytami? Czy powinny być serializowane do przechowywania lub przenoszenia?
  3. w którym momencie staje się konieczne, aby moja istota mogła być serializowana?
Author: Roman, 2010-01-07

11 answers

Zwykle dzieje się tak, gdy mieszasz zapytania HQL i natywne zapytania SQL. W HQL, Hibernate mapuje typy, które przekazujesz do tego, co rozumie DB. Kiedy uruchamiasz natywny SQL, musisz zrobić mapowanie samodzielnie. Jeśli tego nie zrobisz, domyślnym mapowaniem jest serializacja parametru i wysłanie go do bazy danych (w nadziei, że go zrozumie).

 42
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 14:33:52

Według specyfikacji JPA:

Jeśli instancja encji ma być przekazywana przez wartość jako odłączony obiekt( np. poprzez zdalny interfejs), Klasa encji musi zaimplementować interfejs Serializowalny.

"JSR 220: Enterprise JavaBeansTM, Wersja 3.0 Java Persistence API Wersja 3.0, finalna wersja 2 maja 2006"

 96
Author: Conor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 18:14:02

Twoje encje muszą być Serializable jeśli chcesz je przenieść over-the-wire( serializować je do innej reprezentacji), przechowywać je w sesji http (która z kolei jest serializowana na dysk twardy przez kontener serwleta) itp.

Ze względu na wytrwałość, Serializable nie jest potrzebna, przynajmniej w Hibernate. Ale to jest najlepsza praktyka, aby je Serializable.

 40
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 14:27:07

Aby uzupełnić miłą odpowiedź Conora, który odniósł się do specyfikacji JSR-317. Zazwyczaj projekty EAR składają się z modułu EJB z EJB odsłoniętymi za pomocą zdalnego interfejsu. W tym jednym przypadku musisz sprawić, aby Twoja fasola entity była serializowalna, ponieważ są one agregowane w zdalnym EJB i są zbudowane tak, aby były przewodowe przez sieć.

Projekt jee6 war bez CDI: może zawierać EJB lite wspierany przez nie serializowalne jednostki JPA.

A jee6 war project with CDI: Beans które używają zakresu sesji, aplikacji lub konwersacji muszą być serializowalne, ale ziarna, które używają zakresu żądania, nie muszą być serializowalne. tak więc podstawowa jednostka JPA - jeśli w ogóle-podążałaby za tą samą semantyką.

 8
Author: Sym-Sym,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 13:30:39

Uważam, że twój problem jest związany z posiadaniem pola typu złożonego (klasy), które nie jest adnotowane. W takich przypadkach domyślną obsługą będzie przechowywanie obiektu w jego serializowanej formie w bazie danych (co prawdopodobnie nie jest tym, co zamierzałeś zrobić) Przykład:

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

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

W powyższym przypadku dane Klienta zostaną zapisane w polu tablicy bajtów w bazie danych w postaci serializowanej.

 6
Author: Avner Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-12 15:09:20

Klasy muszą zaimplementować Serializable, jeśli chcesz je serializować. Nie jest to bezpośrednio związane z JPA i specyfikacja JPA nie wymaga, aby podmioty były serializowalne. Jeśli Hibernate naprawdę narzeka na to, przypuszczam, że jest to błąd Hibernate, ale przypuszczam, że bezpośrednio lub pośrednio robisz coś innego z bytami, które wymagają, aby były serializowalne.

 4
Author: jarnbjo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 14:31:12

Zgodnie z docs hibernate , używając adnotacji @ JoinColumn:

Posiada jeszcze jeden parametr o nazwie referencedColumnName. Parametr ten deklaruje kolumnę w jednostce docelowej, która zostanie użyta do połączenia. Zauważ, że gdy używasz referencedColumnName do kolumny z kluczem innym niż klucz podstawowy, powiązaną klasą musi być Serializable.

 2
Author: aman maharjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-09 03:06:28

Remote hit using postman, ajax lub angular js etc....., może spowodować powtórzenie cyklu z wyjątkiem StackOverflow z Jacksonem fasterxml.So, lepiej jest użyć serializera.

 1
Author: tamil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 12:10:27

Proszę odnieść się http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to jest napisane, Implementacja java. io. Serializable jest po prostu wymagana do przesyłania danych przez IIOP lub JRMP (RMI) między instancjami JVM. W przypadku czystej aplikacji webowej obiekty domeny są czasami przechowywane w HTTPSession w celach buforowania / optymalizacji. Sesja http może być serializowana (pasywacja) lub klastrowa. W obu przypadkach cała zawartość musi być Serializowalna.

 1
Author: Arun K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 09:39:49

Jest to również błąd, który jest wyrzucany, gdy przekazujesz niepoprawnie wpisane ID jako drugi param do czegoś takiego jak em.find () (tzn. podanie samego encji, a nie jego ID). Nie znalazłem jeszcze konieczności deklarowania encji JPA serializable--nie jest to naprawdę konieczne, chyba że używasz referencedColumnName zgodnie z opisem Amana.

 0
Author: Amalgovinus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 20:20:17
  1. w którym momencie staje się konieczne, aby moja istota mogła być serializowana?

Implementacja ehcache z diskstore jako drugiego poziomu pamięci podręcznej (tzn. użycie @Cacheable adnotacji na encji lub metody repozytorium/usługi) wymaga Serializowalnego, w przeciwnym razie pamięć podręczna zawiedzie (NotSerializableException), aby zapisać encję do pamięci podręcznej dysku.

 0
Author: Michal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 13:15:11