我在Hibernate中建立两个实体之间的关联时遇到了困难。这种关系很复杂。
我们有一个表(我们称之为Translations),其中包含我们程序中使用的翻译,其主键是基本文本和语言代码。这意味着有几行具有相同的基本文本但具有不同的语言代码。
Translations:
BaseText
LanguageCode
我有第二个表(让我们称之为用法),它表示对于Translations表中的每个不同的BaseText,它在程序中使用它。可以在程序中的多个位置使用相同的文本,因此可能有多行具有相同的文本但具有不同的程序。
Usage:
Text
Program
将它们联系在一起的一个字段是“使用中的文本”和“翻译中的基础文本”。如果我想编写一个选择与特定程序相关的翻译的查询(如使用表中所示),我可能会写一些类似的东西:
select * from Translations inner join Usage on Translations.BaseText = Usage.Text where Usage.Program = ?
但是,我正在使用hibernate和JPA来执行此操作。我看到很多用于在两个实体之间创建父子关联的示例,但是这种关系显然有点不正常。这可能更好地用中间表和多对多关系表示,但是为了使事情变得更复杂,这是使用遗留数据库的遗留程序,因此我无法真正添加任何表。
我发现最接近我的问题的问题是here,但它处理的是更清晰的父子关系。如果我只使用一个JoinColumn
,则会抱怨整个主键不满足。
使用注释,我应该如何构造我的实体,以便我可以选择通过Usage.program查询翻译实体(如果在给定程序的Usage中至少存在一行,我想检索其对应的翻译行)?
这就是我目前的情况:
@Entity
public class Translation
@Id
private String baseText;
@Id
private String languageCode;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="baseText", referencedColumnName="text", nullable=false, insertable = false, updatable = false)
private Usage usage;
// .. getters and setters
}
@Entity
public class Usage {
@Id
private String text;
@Id
private String program;
// .. getters and setters
// OneToMany counterpart added, but I removed it because it seemed to
// make Usage the "owner" entity of the relationship, which isn't my case
}
感谢您提供的任何帮助。