Переопределение отображений для карты основных типов - PullRequest
2 голосов
/ 27 января 2012

Я работаю над комплектом соответствия JPA 2.0 для моей стажировки ... Часть этого комплекта занимается тестированием угловых случаев.

На странице 360 JSR-317 заявляет, что "аннотация AttributeOverride может бытьприменяется к коллекции элементов, содержащей экземпляры встраиваемого класса, или к коллекции карт, ключ и / или значение которой являются встраиваемым классом."

Как тогда, в соответствии с JPA 2.0переопределить отображение карты основных типов?Я знаю, что могу использовать @MapKeyColumn для сопоставления ключа карты, и я уверен, что есть и какой-то способ сопоставить сторону значений @CollectionTable ...

Но как мне поступить?переопределяя их?

Рассмотрим @Embeddable с картой

@CollectionTable
@MapKeyColumn(name="differentname_KEY")
Map<Integer, String> testMap;

Как мне переопределить ключ и значение?Я использую @AttributeOverride или что-то еще?(Или это невозможно?!)

Я предполагаю, что такая карта будет отображена с помощью @CollectionTable, поэтому, пожалуйста, исправьте меня, если я ошибаюсь.Если JPA не дает ответа, мне было бы интересно узнать, как поставщики персистентности решили эту проблему.

РЕДАКТИРОВАТЬ: Viruzzo отметил, что базовые типы являются встраиваемыми типами.Я готов принять это, но что-то меня сдерживает: JSR-317 ссылается на встраиваемый класс (см. Верхнюю цитату).Тип и класс не совпадают ...

1 Ответ

1 голос
/ 25 февраля 2012

Сначала как примечание: карта в вашем примере даже не должна компилироваться. Причина в том, что int является примитивным типом, java.util.Collection интерфейсы и реализации коллекции и отображения предназначены только для ссылочных типов.

Позволяет использовать вместо этого следующий пример:

SomeEntity {
  @Id private int id;
  @ElementCollection
  private Map<Integer, String> testmap; 
}

По умолчанию testMap сопоставляется с таблицей SomeEntity_TESTMAP(SOMEENTITY_ID, TESTMAP, TESTMAPKEY). У нас есть имя таблицы по умолчанию и три по умолчанию имена столбцов. Все это можно переопределить. Ниже приведено сопоставление с таблицей testmap_table (join_column, value_column, key_column):

@ElementCollection
@CollectionTable(name = "testmap_table", 
                 joinColumns = @JoinColumn(name = "join_column"))
@MapKeyColumn(name = "key_column")
@Column(name= "value_column")
private Map<Integer, String> testMap;

@ AttributeOverride здесь бесполезен, потому что ни ключ, ни значение не являются встраиваемыми. Он предназначен для переопределения отображений, полученных из других источников, а не для переопределения значений по умолчанию ElementCollection. Это имеет два использования:

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