2011-01-15 8 views
3

こんにちは私は休止状態の世界では非常に新しく、ロードブロッキングを起こしたようです。私が格納する必要があるオブジェクトにはハッシュマップがあります。HibernateでHashMapを永続化する方法

private Map<String, SentimentFrequencyCounts> modelData = null; 

事は、私は、ソート、検索または私はちょうどオブジェクトとそれを保存して、オブジェクトがロードされたときにそれをロードする必要があり、このマップにすべてのことを行う必要は決してありませんので、私はいくつかがあった期待していましたハイバネートはそれをシリアル化してCLOBまたはBLOBフィールドに格納することができますが、それを行う方法は見つけられません。

は、だから私は、次の休止持っているので、

@OneToMany(mappedBy="ngram_data", fetch = FetchType.EAGER) 
@MapKey(name = "attributeName") 
public Map<String, SentimentFrequencyCounts> getModelData() { 
    return modelData; 
} 

のようにこれを保存しようとしたが、これは私に、実行時に次の例外を与える org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:

SentimentFrequencyCountsクラスは、私がしようとしています1の内部クラスです持続する。だから基本的には、私は実際にハッシュマップのためにどのように休止状態が動作するのか理解していないと思います。本当に残念ですが、私はこれをシリアル化して単一の列にまとめてもらうことはできません。

ご協力いただきありがとうございます。

+0

あなたは 'SentimentFrequencyCoungs'をマッピングしたどのように?別のエンティティですか?コンポジット? – Jeremy

+0

SentimentFrequencyCount(Serializableです)は@Embeddableとマークされていますが、運がないエンティティにもしようとしました – JNR

答えて

1

既存の注釈を取り除き、@Lob - specifies that a persistent property or field should be persisted as a large object to a database-supported large object typeで注釈を付けてください。

変数の型がSerializableのサブタイプだった場合は、注釈をそのまま残すことができます。デフォルト・マッピングに関するJPAのルールでは、シリアライズ可能でプリミティブではないタイプ、またはEmbeddableのタイプがシリアル化され、BLOBカラムに格納されていることが示されています。ただし、ArrayListはSerializableではありません。

@ElementCollectionで@Lobを使用することはできますが、結果が何であるか分かりません。私はそれがリスト全体をシリアライズするか、各リスト要素が別々にシリアライズされる表を作成するかどうかはわかりません。それはおそらくいずれかの方法であなたに興味がありません。

かなり後にEDITは:仕様の勤勉な学生が知っているようもちろん、この注釈はSerializableをタイプの分野ではなく、単に直列化クラスのオブジェクトを保持するために起こるのフィールドに動作します。したがって、この仕事をするには、あなたは無神論に従事しなければなりません。私は交差点タイプで囲まれた一般的なワイルドカードで何か巧妙なことをすることができるかどうかを見てきましたが、私はあなたができるとは思いません。ただし、このような小さなクラスを記述することができます。

class SerializableInstanceOf<T> implements Serializable { 
    public final T instance; 

    public SerializableInstanceOf(T instance) { 
     Serializable s = (Serializable)instance; 
     this.instance = instance; 
    } 
} 

そしてリストのためのホルダーとしてそれを使用 - エンティティが@Lobでマークされたこのタイプのフィールドを持ち、中リストへの参照を保持しますそれ。リストを操作するたびに、エンティティのgetListメソッドを介して、おそらくインスタンスフィールドを経由します。

これは醜いですが、あなたがする必要があることをする必要があります。

+0

これは一般的な正しい解決策だと思いますが、java.util.HashMapをキャストできませんjava.sql.Blob例外、HashMapは私のキーと値のクラスであるため、Serializableです。なぜそれをキャストできないのか分かりませんが、正しい方向のポインタについてもう一度感謝します – JNR

+0

@JNR:違う。 EJB 3.0永続性仕様の2.1.1節を参照してください。「エンティティの永続的なフィールドまたはプロパティは、次のタイプになる可能性があります」という段落を参照してください。このパラグラフでは実際にMap型のフィールドは使用できません。おそらく、HashMapを宣言する必要があります。不快な。他に何ができるか分かりません。 –

1
@org.hibernate.annotations.Type(
     type = "org.hibernate.type.SerializableToBlobType", 
     parameters = { @Parameter(name = "classname", value = "java.util.HashMap") } 
) 
public Map<String, SentimentFrequencyCounts> getModelData() { 
    return modelData; 
} 

あるいは単にこれは、ほとんどの場合(分散キャッシュかもしれない問題)で動作します:

@org.hibernate.annotations.Type(type = "org.hibernate.type.SerializableType") 
public Map<String, SentimentFrequencyCounts> getModelData() { 
    return modelData; 
} 
+1

ヘック、ちょうど@Basicを使用すると動作する可能性があります –

+0

私はあなたの最初のオプションを使用し、それは働いた!私はマップを保持し、それを取得することもできます。 2番目のクラスは動作しませんでした。スタックトレースは、クラスがクラスパス内にあってもorg.hibernate.type.Serializableを見つけることができないと述べています。それがどうなっているのか分かりません。 ¯\\ _(ツ)_ /¯ – geekonablog

+1

おっと、それは2番目のものにはタイプミスが含まれていたからです。 'org.hibernate.type.SerializableType'だけでなく' org.hibernate.type.SerializableType'だったはずです。私は上記を修正しました。 –

関連する問題