【发布时间】:2014-12-04 01:12:00
【问题描述】:
我正在尝试使用 Hibernate 和 JPA 注释将子类 HashMap 持久保存在数据库中。
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
@Entity
@Table(name = "module")
public class Module {
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@Column(name = "version")
private String version;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "module_parameter")
@MapKeyColumn(name = "key")
@Column(name = "value")
private Parameters params = new Parameters();
// Getters & setters
}
这在尝试存储参数时给了我以下异常:
org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: Module.params
当我将声明更改为
private Map<String, String> params = new Parameters();
public Parameters getParams() {
return (Parameters) params;
}
我得到以下输出:
Hibernate: select module0_.id as id1_0_, module0_.description as descript2_0_, module0_.name as name3_0_, module0_.version as version4_0_ from module module0_
Hibernate: select params0_.Module_id as Module_i1_0_0_, params0_.value as value2_1_0_, params0_.key as key3_0_ from module_parameter params0_ where params0_.Module_id=?
Exception in thread "main" java.lang.ClassCastException: org.hibernate.collection.internal.PersistentMap cannot be cast to Parameters
如果我把它改成
private Map<String, String> params = new HashMap<>();
一切正常。
那么我如何告诉 Hibernate Parameters 是一个集合?
【问题讨论】:
-
FWIW 你上面的内容可以在我使用的 JPA 实现(DataNucleus)中开箱即用。也许一些 JPA impls 只提供对 Map、HashMap 等显式类型的支持?