在Hibernate

时间:2017-03-11 15:56:06

标签: java hibernate domain-driven-design hibernate-xml-mapping

我已经在Hibernate's forum上问了这个问题,但我想我也会在这里提出这个问题。

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

enter image description here

这两个值都是依赖对象

理想情况下,我会TranslatedText <component>作为Question Translation <bag> <composite-element> TranslatedText Question TranslatedText title }。

如果description仅引用一个Translation,那么映射会很简单,但由于它引用了两个{I},我需要某种基于保存值的属性名称的鉴别器({{ 1}}或(question_id,property_name,language_code)),以便将propertyName映射到由Title组成的外键。

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

因此,我尝试更改模型并引入专门的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>作为鉴别器。

enter image description here

最后并没有多大帮助:

TranslatedText

带有Question

的TranslatedText

我设法通过使用<many-to-one>Translation映射为TranslatedText中的实体,然后将TranslatedText映射为一组值来设法得到我所需要的内容Translation,但这种方法的主要问题是没有简单的方法可以摆脱孤立的np.polynomial.polynomial.Polynomial((1,2,3)) # Polynomial([ 1., 2., 3.], [-1, 1], [-1, 1]) np.polynomial.polynomial.Polynomial([1,2,3]) 。我要么必须使用数据库触发器或预定的进程来执行此操作。

结论

此时我的印象是Hibernate不够灵活,不能用正确的语义映射初始模型,但希望我错了,有办法做到这一点。

1 个答案:

答案 0 :(得分:1)

我还没有找到将它们映射为值的方法。但是,下一个解决方案可行,它可能对您有所帮助。我删除了TranslatedText并将Question直接与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;
}