我已经在Hibernate's forum上问了这个问题,但我想我也会在这里提出这个问题。
我正在尝试映射以下模型,同时保留TranslatedText
和Translation
值对象的值语义:
理想情况下,我会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>
作为鉴别器。
最后并没有多大帮助:
TranslatedText
Question
我设法通过使用<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不够灵活,不能用正确的语义映射初始模型,但希望我错了,有办法做到这一点。
答案 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;
}