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

Aks*_*hay 7 java hibernate

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

<parent>
  <key1> value </1key>
  <key1> value </1key>
  <key1> value </1key>
  <key1> value </1key>
   ...
  <key1> value </1key>
</parent>
Run Code Online (Sandbox Code Playgroud)

现在我不知道有多少关键值将提前来自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
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它映射到hibernate对象?我想要跟随结构类Parent {int parentId; String parent Name KeyValue keyval; //我如何建模?

}

AM使用netbeans IDE.

JB *_*zet 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;
}
Run Code Online (Sandbox Code Playgroud)

您还应该有一个独特的约束[parent_id - key].

  • 可以使用Map <String,String>来完成.也就是说,我可以直接生成map <key,value>而不必为key-value创建包装类吗? (4认同)

小智 5

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

对于键值对存储在MY_MAP_TABLE中并定义为名为“设置”的属性的地图属性:

定义属性:

@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;
}
Run Code Online (Sandbox Code Playgroud)

和存储地图的表:

    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)
    );
Run Code Online (Sandbox Code Playgroud)


cha*_*ybr 5

如果 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
}
Run Code Online (Sandbox Code Playgroud)

在这种方法中,KeyValuePair 始终与其父项一起持久化、合并、删除。

参考: