Hibernate:OneTomanyマッピングPKに基づいていませんか?
-
26-09-2020 - |
質問
私は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()
.
文字列 "ヨーロッパ" :)
を受け取る所属していません StackOverflow