Speichern von Objekten in Spalten mithilfe von Hibernate JPA

8

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%     
satnam 23.01.2010, 02:43
quelle

4 Antworten

13

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).

%Vor%

Vergessen Sie nicht, die Person class Serializable zu machen und eine echte serialVersionUID hinzuzufügen (ich zeige hier nur einen Standard):

%Vor%

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).

    
Pascal Thivent 23.01.2010 10:50
quelle
1

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.

    
Bozho 23.01.2010 06:46
quelle
1
%Vor%

Wenn Sie keine Hibernate-Annotationen verwenden können, versuchen Sie Folgendes:

%Vor%     
Sergey Demin 23.01.2010 13:14
quelle
0

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.

    
Ondra Žižka 23.01.2010 04:01
quelle