質問

私は2つのエンティティ/テーブルを持っています。

Oneは適切なエンティティです.dataを呼び出しましょう。いわゆる「多言語コード」を含むいくつかのフィールドがあります。

2番目のテーブル、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= My continentCodeプロパティの値からのすべてのレコードが必要です。あるいは、この種の関係を表すより適切な方法があるかもしれませんか?

nb:残念ながらSQLスキーマを変更することはできません...

役に立ちましたか?

解決

OK、私は解決策を見つけました。私のデータエンティティのOneTomanyマッピングはそのようになります:

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

私はまた、それが機能するためにContineCode列をマッピングする必要がありました。私はそれをしなかった、私はa:

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() 
.

文字列 "ヨーロッパ" :)

を受け取る

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top