Pergunta

Eu tenho 2 entidades/tabelas.

Uma é uma entidade adequada, vamos chamá-la data.Possui vários campos contendo os chamados "códigos multilíngues".

A segunda mesa, code, contém os próprios valores multilíngues.

Aqui estão alguns dados de exemplo:

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

Gostaria de mapear as propriedades continentes, países etc. na entidade Dados como um Mapa, assim:

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

Para que eu possa ler o texto no idioma certo assim:

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

Preciso também conseguir fazer pesquisas de texto sobre os valores desses "códigos", utilizando a linguagem do usuário.(por exemplo.obtenha todos os dados onde country='suisse', em francês!)

Então, é possível mapear um OneToMany coleção usando um campo-chave que não é a chave primária da entidade atual?Preciso da minha coleção de continentes "todos os registros da tabela Code onde o código = o valor do meu continentCode propriedade".Ou talvez exista uma forma mais apropriada de representar esse tipo de relacionamento?

Observação:Infelizmente não consigo alterar o esquema SQL ...

Foi útil?

Solução

OK, encontrei a solução.O mapeamento OneToMany na minha entidade Data é assim:

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

Também tive que mapear a coluna continentCode para que funcionasse.Eu não fiz isso, recebi um:

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)

Agora posso fazer:

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

e receba a string "Europa" :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top