在hibernate中存储键值对我们可以使用地图吗?

时间:2011-08-20 11:22:53

标签: java hibernate

我有一个xml文件,其中我有一些键值对。我想以键值对的形式存储它们

<parent>
  <key1> value </1key>
  <key1> value </1key>
  <key1> value </1key>
  <key1> value </1key>
   ...
  <key1> value </1key>
</parent>

现在我不知道有多少关键值会提前来自xml。如何将它映射到hibernate对象? 我可以在

中的表格中找到它
primaryKey parentId    key   value
   1          1         k1     val
   2          1         k2     val
   3          1         k3     val
   4          2         k1     val
   5          2         k2     val
   6          3         k3     val

如何将其映射到hibernate对象? 我想要以下结构 class Parent {   int parentId;   字符串父名称   KeyValue keyval; //我如何建模呢?

}

AM使用netbeans IDE。

3 个答案:

答案 0 :(得分:7)

您确实可以使用地图:

public class Parent {
    @Id
    private Integer id;

    @OneToMany(mappedBy = "parent")
    @MapKey(name = "key")
    private Map<String, KeyValuePair> keyValuePairs;
}

public class KeyValuePair {
    @Id
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @Column(name = "key")
    private String key;

    @Column(name = "value")
    private String value;
}

您还应该对[parent_id - key]

设置唯一约束

答案 1 :(得分:4)

您也可以直接映射到表而无需创建KeyValuePair类

对于具有存储在MY_MAP_TABLE中的键值对的map属性,并将其定义为名为“settings”的属性:

定义属性:

@ElementCollection (fetch=FetchType.EAGER)
@CollectionTable(name="MY_MAP_TABLE" , joinColumns=@JoinColumn(name="ID"))
@MapKeyColumn(name="name")
@Column(name="value")
public Map<String, String> getSettings() {
   return settings;
}

用于存储地图的表格:

    CREATE TABLE MY_MAP_TABLE (
    ID          NUMBER not null REFERENCES  MY_PARENT_TABLE(ID),
    NAME        VARCHAR2(256) not null,
    VALUE       VARCHAR2(256) not null,
    PRIMARY KEY (ID , NAME)
    );

答案 2 :(得分:3)

如果KeyValuePair完全由Parent私有,那么更好的方法是:

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private long id;

    @ElementCollection(fetch=FetchType.EAGER)
    @MapKeyColumn(name="key")
    @CollectionTable(name="keyvaluepair", joinColumns= @JoinColumn(name="id"))
    private Map<String, KeyValuePair> keyValuePairMap = 
            new HashMap<String, KeyValuePair>();

    //getter and setter methods 

}

@Embeddable
public class KeyValuePair {

    //no need of declaring key
    //key column will be created by MapKeyColumn

    private String value;

    //getter and setter methods
}

在这种方法中,KeyValuePair始终与父级一起保持,合并,删除。

参见: