2015-02-10 3 views
0

В моем текущем весеннем проекте, я ищу способ отображения поля, как в одном из своих сущностей:Картирование java.util.Map в Entity с Hibernate

частного атрибута Карта;

где тип ключа должен быть строкой с двумя символами, представляющей язык, а тип для значения должен быть строкой длиной около 128 Кбит.

с этим, я должен быть в состоянии использовать что-то подобное для хранения данных для этого атрибута в моей базе данных:

<select name="..." multiple="multiple"> 
    <option value="..."> ... </option> 
</select> 

<textarea name="..."> ... </textarea> 

где в избранном выбрать один язык и введите в текстовом поле я вставляю текст на выбранном языке.

В моих представлениях, реализованных с тимелеафом, я хочу прочитать текст, связанный с языком пользователя.

Любой может сказать мне, есть ли способ, используя Hibernate, для отображения такого поля od od?

ответ

1
@OneToMany 
private Map<String, String> attribute; 

Добавить @MapKeyColumn и/или @Column, если имена столбцов не совпадают по умолчанию JPA в. Используйте generics для вашей Карты (Map<String, String>), поэтому вам не нужно указывать типы вручную.

3

Вы можете делать то, что предлагает duckstep, но если вы хотите получить более тонкий контроль над таблицами отображения, вы можете использовать следующие аннотации.

@ElementCollection(fetch=FetchType.EAGER) 
@CollectionTable(name = "FOO_TABLE", joinColumns = @JoinColumn(name = "fooId")) 
@MapKeyColumn(name="mapKey") 
@Column(name = "mapValue") 
private Map<String, String> fooMap = new HashMap<String, String>(); 

Это означает, что FOO_TABLE будет иметь 4 столбца. Идентификационная колонка в качестве первичного ключа, mapKey (varchar(255)), mapValue (varchar(255)) и fooId как внешний ключ.

Аннотации примененной к карте сделать следующие вещи:

@ElementCollection(fetch=FetchType.EAGER) - Сообщает Hibernate, что у вас есть набор элементов (струны), и что эти элементы должны всегда быть охотно неправдоподобными. Примените это, если вы никогда не хотите, чтобы ваша карта была нулевой. С другой стороны, если выборка карты является дорогостоящим запросом или карта будет особенно большой, и вам это не всегда нужно, установите вместо этого FetchType.LAZY. (См. here для детальной идеи EAGER vs LAZY)

@CollectionTable - Сообщает, что значения вашей коллекции хранятся на столе. Имя таблицы задается параметром name, а столбец FK указывается с помощью аннотации @JoinColumn.

@MapKeyColumn - Указывает на столбец, содержащий значения для ключей карты.

@Column - Указывает на столбец, содержащий значения для значения карты.

Вы можете легко изменить значения для @MapKeyColumn и @Column, если хотите.

Обратите внимание, что если вы обнаружите, что не возвращаете отдельные значения на карте, попробуйте добавить в коллекцию @Fetch(FetchMode.SUBSELECT). Это указывает на то, что Hibernate должен отбирать значения карты, а не пытаться присоединиться к их родителям.

+0

не могли бы вы рассмотреть этот вопрос http://stackoverflow.com/questions/41697714/hibernate-persist-mapstring-string-without-referencing-another-tables? –

Смежные вопросы