Как настроить коллекцию элементов для сопоставления существующей таблицы БД в конфигурации JPA orm.xml? - PullRequest
3 голосов
/ 29 сентября 2011

Я перенес приложение из полнофункционального Hibernate на приложение JPA / Hibernate, и у меня возникла проблема с отображением JPA.

Нам удалось использовать orm.xml для сопоставления наших объектов. Все работало нормально, пока мне не пришлось иметь дело с коллекцией элементов. На самом деле, у меня есть объект с именем Пользователь , который имеет встроенную карту (коллекция карт называется предпочтения ). Итак, у нас есть что-то вроде этого:

public class User {
        private Long id;
        private Map<String, String> preferences;
}

В нашей полностью спящей версии генерируется таблица PREFERENCE (ID, имя, значение). Но когда мы попытались перенести его в JPA, мы использовали следующее отображение:

<element-collection name="preferences" target-class="java.lang.String" fetch="LAZY">
       <map-key-class class="java.lang.String" />
       <map-key-column name="[name]" />
       <column name="[value]" />
       <collection-table name="PREFERENCE">
           <join-column name="ID" />
       </collection-table>
</element-collection>

и создается новая User_Preferences таблица. Несмотря на то, что я указал атрибут name = 'PREFERENCES' в конфигурации xml, Я не могу заставить коллекцию элементов указывать на существующую таблицу PREFERENCES .

Вы когда-нибудь сталкивались с такой ситуацией? Любая помощь будет принята с благодарностью.

Большое спасибо, парень,

Ответы [ 2 ]

9 голосов
/ 29 сентября 2011

Похоже, ошибка. Я не могу указать что-то не так с вашими отображениями, и я попробовал это с EclipseLink 2.3.0 и такой созданной таблицей сопоставлений с именем PREFERENCE. Также пытался с Hibernate 3.5.6, и имя таблицы USER_PREFERENCES, как вы сказали.

Похоже, они просто отбрасывают имя для коллекционного стола. Но то же самое с аннотациями отлично работает:

@ElementCollection(targetClass = java.lang.String.class)
@MapKeyClass(java.lang.String.class)
@MapKeyColumn(name="name")
@CollectionTable(name = "PREFERENCE", joinColumns = @JoinColumn(name="ID"))
@Column(name="value")
0 голосов
/ 29 сентября 2011

Вы пробовали эту структуру:

Set<Preference> preferences;

затем преобразуйте ваш набор в карту вычислительным путем.

...