2012-01-27 3 views
2

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

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

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

Но как бы я пошел, переопределяя эти ?

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

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

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

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

EDIT: Viruzzo прокомментировал, что базовые типы являются встраиваемыми типами. Я согласен с этим, но что-то удерживает меня: JSR-317 имеет в виду вложенный класс (см. Верхнюю цитату). Тип и класс не совпадают ...

+2

Основные типы встраиваемых; Я бы сказал, что это просто плохой выбор слов. – Viruzzo

+0

Если вы добавили, что в качестве ответа я мог бы принять его ... Вы уверены, что нет никакой разницы?Есть разница в глубине от того, что я видел: в случае встраиваемого это будет '@AttributeOverride (name =" embeddable.testMap.key.attribute "[column опущен]), и в случае базового типа он будет затем введите '@AttributeOverride (name =" embeddable.testMap.key "[column опущен])'. – Pimgd

+0

@MapKeyClass также указывает, что «ключ карты может быть базовым типом, вложенным классом или сущностью», что приводит к дальнейшей поддержке того, что встраиваемый тип не совпадает с встраиваемым классом. – Pimgd

ответ

1

Сначала как примечание стороны: Карта в вашем примере не должна компилироваться. Причина в том, что 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. У него есть два использований:

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

исправил ошибку компиляции, спасибо. Я посмотрю на это более подробно, когда приеду на работу завтра ... Я вижу, что '@ AttributeOverride' не может быть использован здесь - что будет использоваться? – Pimgd

+0

Используется для чего, можете ли вы привести пример о функциональности, которую вы пропустите? В примере, который я дал, есть три столбца, и для всех их по умолчанию имя столбца переопределено (@JoinColumn, MapKeyColumn, @Column). –

+0

Как переопределение будет переопределено вне класса SomeEntity (например, как работает @AttributeOverride - переопределение отображения в классе A из класса B) – Pimgd

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