在hibernate中存储键值对|可以使用map吗?



我有一个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对象?我想要下面的结构类父母{int parentId;字符串父名称KeyValue;//如何建模?

}

使用netbeans IDE

您确实可以使用映射:

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]有一个唯一的约束。

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

对于键值对存储在MY_MAP_TABLE中并定义为名为'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)
    );

如果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总是被持久化、合并、删除。

参考:

  • http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection
  • http://hwellmann.blogspot.in/2010/07/jpa-20-mapping-map.html

相关内容

最新更新