Wie beibehalten einer HashMap mit hibernate
Hallo ich bin sehr neu in der hibernate-Welt und scheinen sich zu treffen haben eine Straßensperre. Das Objekt brauche ich, um zu speichern hat eine hashmap.
private Map<String, SentimentFrequencyCounts> modelData = null;
Die Sache ist die ich nie brauche, zu suchen, zu Sortieren oder muss irgend etwas mit dieser Karte brauche ich nur, um es zu speichern mit dem Objekt und laden Sie es, wenn das Objekt geladen ist, so dass ich hoffte, dass es einen Weg gab, dass hibernate konnte nur serialisiert und dann speichern Sie es in ein CLOB-oder BLOB-Feld, aber ich kann nicht scheinen zu finden, irgendeine Möglichkeit, das zu tun.
Also habe ich weiter versucht zu haben, hibernate speichern Sie diese wie so
@OneToMany(mappedBy="ngram_data", fetch = FetchType.EAGER)
@MapKey(name = "attributeName")
public Map<String, SentimentFrequencyCounts> getModelData() {
return modelData;
}
Aber dieser gibt mir folgende exception zur Laufzeit
org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:
Den SentimentFrequencyCounts-Klasse ist eine innere Klasse von der, die ich bin versucht zu bestehen. Also im Grunde denke ich, bin ich wirklich nicht verstehen, wie hibernate arbeitet für hashmap. Wirklich eine Schande, ich kann einfach nicht bekommen, es zu serialisieren und diese Klumpen es in einer einzigen Spalte.
Vielen Dank im Voraus für Ihre Hilfe und Zeit.
SentimentFrequencyCoungs
? Ist es eine separate Einheit? Ein composite?Ich habe SentimentFrequencyCount (es Serialisierbar ist) markiert ist, als @Embeddable, aber ich habe auch versucht, es zu machen einer Person auch nicht mit Glück
InformationsquelleAutor JNR | 2011-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehmen Sie Ihre vorhandenen Anmerkungen und kommentieren Sie die Liste mit @Lob - das gibt an, dass eine permanente Eigenschaft oder das Feld beibehalten werden sollte als ein großes Objekt in einer Datenbank-unterstützten large-object-Typ.
Wenn der Typ der Variablen wurde ein Subtyp von Serializable, Sie könnten nur lassen Sie die Anmerkungen insgesamt; JPA-Regeln auf Standard-mappings Zustand, dass Arten, die nicht Serialisierbar sind und nicht primitiv oder
Embeddable
serialisiert und gespeichert in BLOB-Spalten. Allerdings, die Liste ist nicht Serialisierbar, obwohl ArrayList ist.Können Sie mit @Lob @ElementCollection, aber ich bin mir nicht sicher, was das Ergebnis ist; ich weiß nicht, ob das serialisiert die ganze Liste oder eine Tabelle erstellt, in der jedes element in der Liste wird separat serialisiert werden. Es ist wahrscheinlich nicht von Interesse für dich so oder so.
VIEL SPÄTER EDIT: natürlich, als ein fleißiger student, der die Skillung wissen, diese Anmerkung funktioniert nur für Felder, die Serializable - Typ, nicht die Felder, die bloß zufällig halten Sie Objekte, die von einer Serialisierbaren Klasse. Folglich, um diese Arbeit zu machen, Sie müssen sich in Spielereien. Ich hatte einen Blick auf, ob Sie etwas tun könnte clever mit ein generischer Platzhalter, begrenzt mit einer Schnittmenge geben, aber ich glaube nicht, dass Sie können. Sie können jedoch schreiben eine kleine Klasse wie folgt aus:
Und verwenden, die als Halterung für die Liste - die Person hat ein Feld von diesem Typ gekennzeichnet mit @Lob, und hält eine Referenz auf die Liste. Jedes mal, wenn Sie möchten, arbeiten Sie mit der Liste, Sie gehen über das Instanz-Feld-wahrscheinlich über ein getList-Methode für die Entität.
Es ist hässlich, aber es sollte Sie tun, was Sie tun müssen.
stellt sich heraus, meine Antwort ist falsch. Siehe Abschnitt 2.1.1 der EJB 3.0 persistence-Spezifikation - dem Absatz, beginnend "Die persistenten Felder oder Eigenschaften einer Person kann der folgenden Typen sein". Dieser Absatz eigentlich nicht erlauben, ein Feld vom Typ "Map". Sie wahrscheinlich benötigen, um es erklären HashMap. Böse. Ich bin mir nicht sicher, was Sie sonst noch tun können.
InformationsquelleAutor Tom Anderson
Oder auch nur dies funktioniert in den meisten Fällen (distributed caching könnte ein problem sein):
Ich habe Ihre erste option und es funktionierte! Ich kann das beibehalten einer Karte und abrufen zu können. Der zweite hat nicht funktioniert, der stack-trace sagte, es nicht finden konnte, org.hibernate.Typ.Serialisierbar, obwohl die Klasse im classpath. Weiß nicht, was es damit auf sich. \_(ツ)_/
Oops, das ist, weil die zweite enthielt einen Tippfehler. Sollte
org.hibernate.type.SerializableType
, nicht nurorg.hibernate.type.Serializable
. Ich habe die Feste, die oben genannten.InformationsquelleAutor Steve Ebersole