1

我已经在Hibernate 的论坛上问过这个问题,但我想我也会在这里问。

我正在尝试映射以下模型,同时保留TranslatedTextTranslation值对象的值语义:

在此处输入图像描述

两个值都作为依赖对象

理想情况下,我会映射TranslatedText<component>withinQuestionTranslationas <bag>of <composite-element>within TranslatedText

如果Question只引用一个TranslatedText,映射会很简单,但由于它引用两个,我需要某种基于属性名称的鉴别器,该属性包含值(titledescription),以便Translation使用由 组成的外键映射(question_id,property_name,language_code)

一个问题是它propertyName不是模型的一部分,也不应该,但我还没有找到一种方法来强制 Hibernate 插入一个不是来自模型的值。

因此,我尝试更改模型并引入专用TitleDescription类,以便我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>TranslationTranslatedTextTranslatedTextTranslation

结论

在这一点上,我的印象是 Hibernate 不够灵活,无法使用适当的语义映射初始模型,但希望我错了,有办法做到这一点。

4

1 回答 1

1

我还没有找到将它们映射为值的方法。但是,下一个解决方案有效,它可能对您有所帮助。我删除TranslatedTextQuestion直接与Translation.

@Entity
public class Question {
    @Id
    private String id;

    @JoinTable
    @OrderColumn
    @OneToMany(fetch = EAGER, cascade = ALL)
    private List<Translation> titleTranslations;

    @JoinTable
    @OrderColumn
    @OneToMany(fetch = EAGER, cascade = ALL)
    private List<Translation>  descriptionTranslations;
}

这里的缺点是Translation必须是Entity类。

@Entity
public class Translation {
    @Id
    private String id;
    private String languageCode;
    private String text;
}
于 2017-03-11T19:09:38.283 回答