我已经在Hibernate 的论坛上问过这个问题,但我想我也会在这里问。
我正在尝试映射以下模型,同时保留TranslatedText
和Translation
值对象的值语义:
两个值都作为依赖对象
理想情况下,我会映射TranslatedText
为<component>
withinQuestion
和Translation
as <bag>
of <composite-element>
within TranslatedText
。
如果Question
只引用一个TranslatedText
,映射会很简单,但由于它引用两个,我需要某种基于属性名称的鉴别器,该属性包含值(title
或description
),以便Translation
使用由 组成的外键映射(question_id,property_name,language_code)
。
一个问题是它propertyName
不是模型的一部分,也不应该,但我还没有找到一种方法来强制 Hibernate 插入一个不是来自模型的值。
因此,我尝试更改模型并引入专用Title
和Description
类,以便我type
可以在其中有一个可以用作鉴别器的方法。
最后,这并没有太大帮助:
<component name="title" class="TranslatedText">
<bag name="translations" table="Translation">
<key>
<!-- PROBLEM: Could not find a way to create a custom join expression on question.id and question.title.type in here. -->
</key>
<composite-element class="Translation">
<!-- PROBLEM: Could not found a way to make Hibernate insert title.type from here, without having this value on the Translation object. -->
<property name="languageCode" type="string" column="language_code"/>
<property name="text" type="string"/>
</composite-element>
</bag>
</component>
翻译文本与<many-to-one>
我设法通过使用 a映射TranslatedText
为实体,然后将其映射为 中的值集合,从而获得了接近我需要的东西,但是这种方法的主要问题是没有简单的方法来摆脱孤立的and 。我要么必须使用数据库触发器或计划进程来执行此操作。Question
<many-to-one>
Translation
TranslatedText
TranslatedText
Translation
结论
在这一点上,我的印象是 Hibernate 不够灵活,无法使用适当的语义映射初始模型,但希望我错了,有办法做到这一点。