Die Frage steht im Titel. Im Folgenden habe ich nur einige meiner Gedanken und Erkenntnisse beschrieben.
Als ich ein sehr einfaches Domänenmodell hatte (3 Tabellen ohne Beziehungen), implementierten alle meine Entitäten NICHT Serializable.
Aber als das Domänenmodell komplexer wurde, bekam ich RuntimeException, die besagte, dass eine meiner Entitäten Serializable nicht implementiert hat.
Ich verwende Hibernate als JPA-Implementierung.
Ich wundere mich:
- Ist es herstellerspezifische Anforderung / Verhalten?
- Was passiert mit meinen serialisierbaren Entitäten? Sollten sie zum Speichern oder Übertragen serialisierbar sein?
- In welchem Moment wird es notwendig, meine Entität serialisierbar zu machen?
Serializable
sind zwei verschiedene Konzepte.Laut JPA-Spezifikation:
"JSR 220: Enterprise JavaBeansTM, Version 3.0 Java Persistence API Version 3.0, endgültige Version 2. Mai 2006"
quelle
Serializable
könnte dabei hilfreich sein und im Kontext der Persistenz konsistenter alsCloneable
zum Beispiel.Sie müssen Ihre Entitäten sein,
Serializable
wenn Sie sie drahtlos übertragen (in eine andere Darstellung serialisieren), in einer http-Sitzung speichern müssen (die wiederum vom Servlet-Container auf die Festplatte serialisiert wird) usw.Nur aus Gründen der Beharrlichkeit wird
Serializable
es zumindest im Ruhezustand nicht benötigt. Aber es ist eine bewährte Methode, sie zu erstellenSerializable
.quelle
Laut den Dokumenten für den Ruhezustand können Sie bei Verwendung der Annotation @JoinColumn:
quelle
Als Ergänzung zu der netten Antwort von Conor, der sich auf die JSR-317-Spezifikationen bezog. In der Regel bestehen EAR-Projekte aus einem EJB-Modul, wobei die EJBs über eine Remote-Schnittstelle verfügbar gemacht werden. In diesem Fall müssen Sie Ihre Entity-Beans serialisierbar machen, da sie in der Remote-EJB aggregiert und für die Verkabelung über das Netzwerk erstellt wurden.
Ein JEE6-Kriegsprojekt ohne CDI: Kann EJB Lite enthalten, das von nicht serialisierbaren JPA-Entitäten unterstützt wird.
Ein JEE6-Kriegsprojekt mit CDI: Beans, die den Sitzungs-, Anwendungs- oder Konversationsbereich verwenden, müssen serialisierbar sein, Beans, die den Anforderungsbereich verwenden, müssen jedoch nicht serialisierbar sein. Somit würden die zugrunde liegenden JPA-Entity-Beans - falls vorhanden - der gleichen Semantik folgen.
quelle
Wenn wir nur über Persistenz sprechen,
Serializable
wird dies nicht benötigt. Es ist jedoch eine bewährte Methode, die Entitäten zu erstellenSerializable
.Wenn wir aussetzen
domain
/entities
Objekte direkt an die Präsentationsschicht ausgesetzt ist , anstelle der Verwendung vonDTO
, in diesem Fall müssen wir implementierenSerializable
. Diese Domänenobjekte können zuHTTPSession
Caching- / Optimierungszwecken gespeichert werden. Eine http-Sitzung kann serialisiert oder geclustert werden. Und es ist auch für die Übertragung von Daten zwischenJVM
-Instanzen erforderlich.Wenn wir die
DTO
Persistenzschicht und die Serviceschicht entkoppeln, markiert das Markieren der Domänenobjekte alsSerializable
kontraproduktiv und würde das "encapsulation
" verletzen . Dann wird es ein Anti-Muster.Zusammengesetzte Bezeichner
Die Primärschlüsselklasse muss serialisierbar sein.
POJO-Modelle
Wenn eine Entitätsinstanz remote als getrenntes Objekt verwendet werden soll, muss die Entitätsklasse die
Serializable
Schnittstelle implementieren .Cache
Wenn Sie eine
clustered
zweite Ebene implementierencache
, müssen dies auch Ihre Entitäten seinserializable
. Der Bezeichner muss sein,Serializable
da dies eine JPA-Anforderung ist, da eridentifier
möglicherweise als Schlüssel für einen Cache-Eintrag der zweiten Ebene verwendet wird.Und wenn wir Entitäten serialisieren, stellen Sie sicher, dass Sie explizit den
serialVersionUID
Modifikator für den privaten Zugriff angeben. Wenn eineserializable
Klasse a nicht explizit deklariertserialVersionUID
, berechnet die Serialisierungslaufzeit einen StandardwertserialVersionUID
für diese Klasse basierend auf verschiedenen Aspekten der Klasse, wie in Java (TM) Object Serialization Specification beschrieben. Die StandardberechnungserialVersionUID
reagiert sehr empfindlich auf Klassendetails, die je nach Compiler-Implementierung variieren können, und kann daherInvalidClassExceptions
während der Deserialisierung zu unerwarteten Ergebnissen führen .quelle
Ich glaube, Ihr Problem hängt damit zusammen, dass ein Feld eines komplexen Typs (einer Klasse) nicht mit Anmerkungen versehen ist. In solchen Fällen wird das Objekt standardmäßig in seiner serialisierten Form in der Datenbank gespeichert (was wahrscheinlich nicht das ist, was Sie beabsichtigt haben). Beispiel:
In dem obigen Fall werden die Kundendaten in ihrer serialisierten Form in einem Byte-Array-Feld in der Datenbank gespeichert.
quelle
JPA-Spezifikation
Gemäß der JPA-Spezifikation sollte eine Entität
Serializable
nur implementiert werden , wenn sie von einer JVM an eine andere übergeben werden muss oder wenn die Entität von einer Stateful Session Bean verwendet wird, die vom EJB-Container passiviert werden muss.Überwintern
Für den Ruhezustand sind nur Entitätsattribute erforderlich,
Serializable
nicht jedoch die Entität selbst.Bei der Implementierung der JPA-Spezifikation gelten jedoch alle JPA-Anforderungen in Bezug auf
Serializable
Entitäten auch für den Ruhezustand.Kater
Laut Tomcat-Dokumentation müssen die
HttpSession
Attribute auch seinSerializable
:Wenn die Entität in der gespeichert ist
HttpSession
, sollte sie implementiert werdenSerializable
.quelle
Klassen müssen Serializable implementieren, wenn Sie sie serialisieren möchten. Dies steht nicht in direktem Zusammenhang mit JPA und die JPA-Spezifikation erfordert nicht, dass Entitäten serialisierbar sind. Wenn sich Hibernate wirklich darüber beschwert, ist es vermutlich ein Hibernate-Fehler, aber ich nehme an, dass Sie direkt oder indirekt etwas anderes mit den Entitäten tun, für die sie serialisierbar sein müssen.
quelle
Weitere Informationen finden Sie unter http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to . Die Implementierung von java.io.Serializable ist lediglich für die Übertragung von Daten über IIOP oder JRMP (RMI) zwischen JVM-Instanzen erforderlich. Bei einer reinen Webanwendung werden die Domänenobjekte manchmal zu Zwischenspeicherungs- / Optimierungszwecken in HTTPSession gespeichert. Eine http-Sitzung kann serialisiert (Passivierung) oder geclustert werden. In beiden Fällen muss der gesamte Inhalt serialisierbar sein.
quelle
Remote-Treffer mit Postman oder Ajax oder eckigen Js usw. können den Wiederholungszyklus mit StackOverflow-Ausnahme mit Jackson schnellerxml verursachen. Daher ist es besser, den Serializer zu verwenden.
quelle
Das Implementieren von ehcache mit Diskstore als Cache der zweiten Ebene (dh Verwenden von
@Cacheable
Anmerkungen zur Entität oder zur Repository- / Servicemethode) erfordert Serializable, andernfalls kann der CacheNotSerializableException
die Entität nicht in den Disk-Cache schreiben ( ).quelle
Dies ist auch der Fehler, der ausgelöst wird, wenn Sie eine falsch eingegebene ID als zweiten Parameter an etwas wie em.find () übergeben (dh die Entität selbst anstelle ihrer ID übergeben). Ich habe es noch nicht für notwendig befunden, JPA-Entitäten tatsächlich als serialisierbar zu deklarieren - es ist nicht wirklich notwendig, es sei denn, Sie verwenden referencedColumnName, wie von aman beschrieben.
quelle
wenn JPA-Entitäten von den Remote-EJB-Operationen als Parameter oder Rückgabewerte verwendet werden
quelle