Hibernate: отображение OneToMany не основано на PK? - PullRequest
2 голосов
/ 21 июля 2010

У меня есть 2 сущности / таблицы.

Один - правильная сущность, назовем ее 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, используя поле ключа, которое не является первичным ключом текущего объекта? Мне нужна моя коллекция континентов "все записи из таблицы кодов, где код = значение моего свойства continentCode". Или, может быть, есть более подходящий способ представить такие отношения?

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

1 Ответ

2 голосов
/ 22 июля 2010

ОК, я нашел решение. Отображение 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() 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...