Вы можете делать то, что предлагает утиный шаг, но если вы хотите более точно контролировать, где находится таблица сопоставления, вы можете использовать следующие аннотации.
@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 столбца. Столбец ID в качестве первичного ключа, mapKey
(varchar(255)
), mapValue
(varchar(255)
) и fooId
в качестве внешнего ключа.
Аннотации, примененные к карте, выполняют следующие функции:
@ElementCollection(fetch=FetchType.EAGER)
— Сообщает Hibernate, что у вас есть коллекция элементов (String), и что эти элементы всегда следует извлекать с нетерпением. Примените это, если вы никогда не хотите, чтобы ваша карта была нулевой. С другой стороны, если получение карты является дорогостоящим запросом или карта будет особенно большой, и она вам не всегда нужна, вместо этого установите FetchType.LAZY
. (См. здесь для подробного ознакомления с EAGER vs LAZY)
@CollectionTable
— сообщает Hibernate, что значения вашей коллекции хранятся в таблице. Имя таблицы задается параметром name
, а столбец FK задается с помощью аннотации @JoinColumn
.
@MapKeyColumn
— указывает на столбец, содержащий значения ключей карты.
@Column
— указывает на столбец, содержащий значения для значений карты.
Вы можете легко изменить значения для @MapKeyColumn
и @Column
, если хотите.
Обратите внимание: если вы обнаружите, что не возвращаете отдельные значения на карте, попробуйте добавить @Fetch(FetchMode.SUBSELECT)
в коллекцию. Это указывает на то, что Hibernate должен выбрать значения карты, а не пытаться присоединить их к вашему родителю.
11.02.2015