Вы можете делать то, что предлагает 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 должен отбирать значения карты, а не пытаться присоединиться к их родителям.
не могли бы вы рассмотреть этот вопрос http://stackoverflow.com/questions/41697714/hibernate-persist-mapstring-string-without-referencing-another-tables? –