簡體   English   中英

如何使用hibernate持久化HashMap

[英]How to persist a HashMap with hibernate

你好,我對hibernate世界很新,似乎遇到了障礙。 我需要存儲的對象中有一個hashmap。

private Map<String, SentimentFrequencyCounts> modelData = null;

事情是我永遠不需要用這個地圖搜索,排序或做任何事情我只需要用對象保存它並在加載對象時加載它,所以我希望有一些方法可以讓hibernate序列化它然后將它存儲在CLOB或BLOB字段中,但我似乎無法找到任何方法。

所以我接下來試圖讓hibernate這樣保存

    @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類是我試圖堅持的類的內部類。 所以基本上我認為我真的不明白hibernate如何為hashmap工作。 真的很遺憾我不能讓它序列化這個並將它集中在一個列中。

在此先感謝您的幫助和時間。

@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;
}

取消現有注釋並使用@Lob注釋列表 - 這指定持久屬性或字段應作為大對象持久保存到數據庫支持的大對象類型

如果變量的類型是Serializable的子類型,則可以完全省略注釋; JPA關於默認映射的規則聲明可序列化且非原始或Embeddable類型被序列化並存儲在BLOB列中。 但是,List不是Serializable,即使ArrayList是。

您可以將@Lob與@ElementCollection一起使用,但我不確定結果是什么; 我不知道是否序列化了整個列表,或者創建了一個表,其中每個列表元素都是單獨序列化的。 無論哪種方式,你都可能不感興趣。

多次編輯:當然,作為規范的勤奮學生,這個注釋只適用於Serializable 類型的字段,而不僅僅適用於容納Serializable 對象的字段。 因此,為了完成這項工作,你將不得不參與惡作劇。 我看看你是否能用一個以交叉類型為界的通用通配符來做一些聰明的事情,但我認為你不能。 但是,您可以像這樣編寫一個小類:

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

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

並使用它作為列表的持有者 - 實體具有標記為@Lob的此類型的字段,並保留對其中列表的引用。 每次要使用列表時,都可以通過實例字段,可能通過實體上的getList方法。

這很難看,但它應該讓你做你需要做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM