2

2 つのエンティティ/テーブルがあります。

1つは適切なエンティティです。それを と呼びましょう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"

また、ユーザーの言語を使用して、これらの「コード」の値をテキスト検索できるようにする必要もあります。(たとえば、フランス語で country='suisse' のすべてのデータを取得します!)

OneToManyでは、現在のエンティティの主キーではないキー フィールドを使用してコレクションをマップすることは可能ですか? 大陸コレクション「コード=私のcontinentCode財産の値であるコードテーブルからのすべてのレコード」が必要です。それとも、この種の関係を表現するためのより適切な方法があるのでしょうか?

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

4

1 に答える 1

2

OK、解決策を見つけました。私のデータ エンティティの 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() 

文字列「ヨーロッパ」を受け取ります:)

于 2010-07-22T09:29:41.660 に答える