如何使用hibernate持久化HashMap

你好,我对hibernate世界很新,似乎遇到了障碍。 我需要存储的对象中有一个hashmap。

private Map modelData = null; 

问题是我永远不需要用这个地图搜索,排序或做任何事情我只需要用对象保存它并在加载对象时加载它,所以我希望有一些方法可以将hibernate序列化它然后将它存储在CLOB或BLOB字段中,但我似乎无法找到任何方法。

所以我接下来试图让hibernate像这样保存

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

但是这在运行时给出了以下exceptionorg.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:

SentimentFrequencyCounts类是我试图坚持的类的内部类。 所以基本上我认为我真的不明白hibernate如何为hashmap工作。 真的很遗憾我不能让它序列化这个并将其集中在一个列中。

在此先感谢您的帮助和时间。

取消现有注释并使用@Lob注释列表 – 这指定持久属性或字段应作为大对象持久保存到数据库支持的大对象类型 。

如果变量的类型是Serializable的子类型,您可以完全省略注释; JPA关于默认映射的规则规定,Serializable而非primitive或Embeddable类型被序列化并存储在BLOB列中。 但是,List不是Serializable,即使ArrayList是。

您可以将@Lob与@ElementCollection一起使用,但我不确定结果是什么; 我不知道是否序列化整个列表,或创建一个表格,其中每个列表元素分别序列化。 无论哪种方式,你都可能不感兴趣。

很多编辑:当然,作为一个勤奋的规范学生会知道,这个注释只适用于Serializable 类型的字段,而不是仅仅碰巧容纳Serializable 类的对象的字段。 因此,为了完成这项工作,你将不得不参与恶作剧。 我看看你是否可以用一个以交叉类型为界的通用通配符做一些聪明的事情,但我认为你不能。 但是,您可以像这样编写一个小类:

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

并使用它作为列表的持有者 – 实体具有标记为@Lob的此类型的字段,并保留对其中列表的引用。 每次要使用列表时,都可以通过实例字段,可能通过实体上的getList方法。

这很难看,但应该让你做你需要做的事情。

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

或者只是在大多数情况下这会起作用(分布式缓存可能是个问题):

 @org.hibernate.annotations.Type( type = "org.hibernate.type.SerializableType" ) public Map getModelData() { return modelData; }