Hibernate持久化Map <string,string =“”>而不引用另一个表

时间:2017-01-17 12:51:30

标签: java hibernate jpa orm hibernate-mapping

你能帮我用Hibernate来持久保存字符串的地图吗?

地图值来自客户端并且是随机的,因此我不想为地图的值存储单独的表

异常

  

引起:org.hibernate.AnnotationException:关联的类没有   发现:java.lang.String

代码

@Entity
public class UserConfig {

    @Id
    @SequenceGenerator(sequenceName = "CONFIG_SEQ", name = "ConfigSeq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ConfigSeq")
    private Long id;

    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "MAP")
    @MapKey(name="key")
    @Column(name="value")
    private Map<String, String> map;

更新

如果Map<MyEnum, String>是未映射的类,请问您还可以解释如何保留MyEnum吗?

1 个答案:

答案 0 :(得分:13)

根据规范,您应该像这样注释地图:

    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "MAP")
    @MapKeyColumn(name="key")
    @Column(name="value")
    private Map<String, String> map;

所以@MapKeyColumn代替@MapKey

这是在将地图定义为:

时注释地图的方式
private Map<Basic, Basic> map; // (i.e. Map<String, String>)

将地图定义为:

时,使用@MapKey注释
private Map<Basic, Entity> map; // (i.e. Map<String, User>)

最后,如果您有地图定义的广告,则使用@MapKeyEnumerated注释:

private Map<Enumeration, Basic> map; // (i.e. Map<MyEnum, String>)