Hibernate:OneToMany 映射不基于 PK?

Posted

技术标签:

【中文标题】Hibernate:OneToMany 映射不基于 PK?【英文标题】:Hibernate : OneToMany mapping not based on PK? 【发布时间】:2010-07-21 16:36:41 【问题描述】:

我有 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 属性的值”。或者也许有更合适的方式来表示这种关系?

注意:很遗憾,我无法更改 SQL 架构...

【问题讨论】:

【参考方案1】:

好的,我找到了解决方案。我的 Data 实体上的 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() 

并接收字符串 "Europe" :)

【讨论】:

以上是关于Hibernate:OneToMany 映射不基于 PK?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hibernate 中创建 OneToMany 映射? [复制]

Hibernate:映射@OneToMany 关系的最后一行

在 Hibernate 双向 ManytoOne、OnetoMany 的映射列中获取 null

在 Hibernate OneToMany 映射中

JPA(休眠)映射OneToMany不正确?

Hibernate OneToMany 关系:未映射到单个属性