Das speichern von Objekten in Spalten mit Hibernate JPA
Ist es möglich, so etwas wie das folgende mit nur einer Tabelle? Gerade jetzt, was mit hibernate zu tun ist, erstellen Sie zwei Tabellen, eine für Familien und eine für Personen. Ich möchte mich für die Familienmitglieder Objekt serialisiert werden soll in der Spalte in der Datenbank.
@Entity(name = "family")
class Family{
private final List<Person> familyMembers;
}
class Person{
String firstName, lastName;
int age;
}
Dies ist nicht klar. Wenn Sie sehen, Familie als eine Gruppe von Menschen ist, dann müssen Sie eine neue Tabelle für familly, es sei denn, Sie vertreten die Familie mit einem einfachen Datentyp wie ein integer oder ein string sein.
OT: Das wäre ein schlechtes design.
Wenn eine Familie aus 3 Mitgliedern, welchen Wert würden Sie erwarten, um zu sehen, in der Spalte in der Datenbank?
OT: Das wäre ein schlechtes design.
Wenn eine Familie aus 3 Mitgliedern, welchen Wert würden Sie erwarten, um zu sehen, in der Spalte in der Datenbank?
InformationsquelleAutor satnam | 2010-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine schreckliche design, und ich bin wirklich nicht empfehlen, es (Sie sollten erstellen Sie einfach eine weitere Tabelle), aber es ist möglich.
Zunächst werden Sie brauchen, um eine
byte[]
Attribut zu halten, wird eine serialisierte version der Liste der Personen, die gespeichert werden in einem BLOB in der Datenbank. So kommentieren es ist getter mit@Lob
(ich würde die getter-und setter -private
nicht machen). Dann setzen Sie "fake" getter und setter zurück oder legen Sie eineList<Person>
von derbyte[]
. Ich bin mitSerializationUtils
von Commons Lang in der Probe unten (stellen Sie eigene Helfer Klasse, wenn Sie nicht wollen, importieren Sie diese Bibliothek) zu serialisieren/Deserialisieren on-the-fly zum/vombyte[]
. Vergessen Sie nicht, markieren Sie die "fake" - getter mit@Transcient
oder Ruhezustand wird versuchen, erstellen Sie ein Feld (und fehlschlagen, da er nicht in der Lage, um zu bestimmen, die Art für eineList
).Vergessen Sie nicht, stellen Sie die
Person
KlasseSerializable
und fügen Sie eine RealeserialVersionUID
(ich bin nur mit einem Standard hier):Aber, lassen Sie mich bestehen, dies ist eine schreckliche design-und es wird sehr zerbrechlich (änderung
Person
kann verlangen, zu "migrieren" der Inhalt des BLOB zu vermeiden Deserialisierung Probleme und das wird schmerzhaft werden. Sie sollten wirklich überdenken dieser Idee und verwenden Sie eine andere Tabelle für diePerson
statt (oder ich verstehe nicht, warum Sie verwenden eine Datenbank).InformationsquelleAutor Pascal Thivent
wenn Sie nicht verwenden können, hibernate annotations versuchen Sie dies:
siehe update auf die Antwort
InformationsquelleAutor Sergey Demin
Kommentieren Sie die Eigenschaft mit
@Column
und definieren Sie den Typ der zuArrayList
, nicht nurList
. Und machenPerson
implementierenSerializable
.Aber dies sollten Sie nur tun, wenn deine Motive sind sehr klar, denn das ist die richtige Lösung in einigen sehr seltenen Fällen. Wie Pascal bemerkt, wenn Sie jemals ändern müssen
Person
Sie haben Kopfschmerzen.java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.sql.Blob
ja, ich habe einen Blick auf eine Klasse von mir, wo ich die gleiche situation - es funktioniert withotu Lob, und mit Angabe der konkreten Typ (ArrayList). Aktualisiert die Antwort
InformationsquelleAutor Bozho
Können Sie erstellen pseudoproperty (getter und setter) nimmt/gibt die serialisierte form, und kommentieren Sie die
familyMembers
mit@Transient
. Dies müsste auch mit dem Getter, keine Felder, die für alle anderen Eigenschaften.InformationsquelleAutor Ondra Žižka