2

У меня есть 2 объекта/таблицы.Hibernate: отображение OneToMany не основано на PK?

Один из них является надлежащим носителем, назовем его data. Он содержит несколько полей, содержащих так называемые «многоязычные коды».

Вторая таблица, code, содержит многоязычные значения.

Вот несколько примеров данных:

Data table 
id name   continentCode countryCode 
------------------------------------ 
1 Toto   EU    CH 
2 Titi   AS    CN 

Code table 
id code language text 
---------------------------- 
1 EU  EN  Europe 
2 EU  FR  Europe 
3 EU  DE  Europa 
4 CH  EN  Switzerland 
5 CH  FR  Suisse 
6 CH  DE  Schweiz 
... etc 

Я хотел бы, чтобы отобразить свойства континентов, стран и т.д. в сущности данных, как карты, так:

@OneToMany() 
@MapKey(name="languageCode") 
private Map<String, Code> continents; 

Так что я могу затем прочитайте текст для правильного языка:

Data toto = dao.findByName("Toto"); 
String text = toto.getContries.get("FR").getText(); //--> returns "Suisse" 
String text = toto.getContries.get("EN").getText(); //--> returns "Switzerland" 

Мне также нужно иметь возможность сделать текст найдите значения этих «кодов», используя язык пользователя. (например, получить все данные, в которых страна = 'suisse', по-французски!)

Итак, можно ли сопоставить коллекцию OneToMany, используя поле ключа, которое не является первичным ключом текущего объекта? Мне нужна моя коллекция континентов «все записи из таблицы Code, где code = значение моего свойства continentCode». Или, может быть, есть более подходящий способ представления такого рода отношений?

NB: К сожалению, я не могу изменить схему SQL ...

ответ

2

ОК, я нашел решение. Отображение OneToMany на моей сущности данных выглядит следующим образом:

@OneToMany() 
@JoinColumn(name="code", referencedColumnName="continentCode", insertable=false, updatable=false) 
@MapKey(name="languageCode") 
private Map<String, AAGeoContinentThesaurusEntry> continents; 

Я также должен был отобразить столбец continentCode для того, чтобы работать. Я фи не делал этого, я получил:

org.hibernate.MappingException: Unable to find column with logical name: GCH_CDE_CODE_CNT in org.hibernate.mapping.Table 
(GCHDATA) and its related supertables and secondary tables 
     at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:396) 
     at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:102) 

Теперь я могу сделать:

myData.getContinentCodes().get("FR").getText() 

и получить строку "Европа" :)

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