хранение пар ключ-значение в спящем режиме |мы можем использовать карту? - PullRequest
7 голосов
/ 20 августа 2011

У меня есть XML-файл, в котором у меня есть несколько пар ключ-значение. Я хочу сохранить их в виде пар ключ-значение

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

Теперь я не знаю, сколько значений ключей будет приходить из xml заранее. Как я могу сопоставить его с объектом гибернации? я могу хранить это в таблице в

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

Как я могу сопоставить его с объектом гибернации? Я хочу следующую структуру class Parent { int parentId; Строка родительское имя KeyValue keyval; // Как мне его смоделировать?

}

AM с использованием IDE NetBeans.

Ответы [ 3 ]

7 голосов
/ 20 августа 2011

Вы действительно можете использовать карту:

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].

5 голосов
/ 06 июня 2013

Вы также можете отобразить непосредственно на таблицу, не создавая класс 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)
    );
3 голосов
/ 04 ноября 2014

Если 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 всегда сохраняется, объединяется, удаляется вместе со своим родителем.

См:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...