Ist es möglich, etwas wie das Folgende mit nur einer Tabelle zu speichern? Im Moment wird der Winterschlaf zwei Tabellen erstellen, einen für Familien und einen für Menschen. Ich möchte, dass das Objekt familymembers in die Spalte in der Datenbank serialisiert wird.
%Vor%Dies ist ein schreckliches Design und ich empfehle es wirklich nicht (Sie sollten nur eine andere Tabelle erstellen), aber es ist möglich.
Zuerst müssen Sie ein byte[]
-Attribut verwenden, um eine serialisierte Version der Liste von Personen zu halten, die in einem BLOB in der Datenbank gespeichert werden. Also kommentiere es mit @Lob
(ich würde den Getter und Setter private
dazu bringen, sie nicht anzuzeigen). Setzen Sie dann "Fake" Getter und Setter für die Rückgabe oder setzen Sie List<Person>
von byte[]
. Ich verwende SerializationUtils
von Commons Lang im folgenden Beispiel (Stellen Sie Ihre eigene Hilfsklasse zur Verfügung, wenn Sie diese Bibliothek nicht importieren möchten), um sie on-the-fly zu / von byte[]
zu serialisieren / zu deserialisieren. Vergessen Sie nicht, den "falschen" Getter mit @Transcient
zu markieren oder Hibernate versucht, ein Feld zu erstellen (und scheitert, weil es den Typ für List
nicht bestimmen kann).
Vergessen Sie nicht, die Person
class Serializable
zu machen und eine echte serialVersionUID
hinzuzufügen (ich zeige hier nur einen Standard):
Aber, lasst mich darauf bestehen, dass dies ein schreckliches Design ist und sehr fragil sein wird (das Ändern von Person
könnte den Inhalt des BLOBs "migrieren" müssen, um Deserialisierungsprobleme zu vermeiden. Dies wird schmerzhaft. Ihr solltet es wirklich überdenken Diese Idee und verwenden Sie stattdessen eine andere Tabelle für die Person
(oder ich verstehe nicht, warum Sie eine Datenbank verwenden).
Kommentieren Sie die Eigenschaft mit @Column
und definieren Sie den Typ als ArrayList
, nicht nur als List
. Und make Person
implementieren Serializable
.
Aber Sie sollten das nur tun, wenn Ihre Motive sehr klar sind, denn das ist die richtige Lösung in einigen sehr seltenen Fällen. Wie Pascal bemerkte, wenn Sie Person
ändern müssen, haben Sie Kopfschmerzen.
Wenn Sie keine Hibernate-Annotationen verwenden können, versuchen Sie Folgendes:
%Vor% Sie können eine Pseudoproperty (Getter und Setter) erstellen, die das serialisierte Formular akzeptiert / zurückgibt und die familyMembers
mit @Transient
mit Anmerkungen versehen. Dies würde auch die Getter, nicht Felder für alle anderen Eigenschaften annotieren müssen.
Tags und Links java jpa hibernate serialization orm