在hibernate中执行复杂实体关系的连接

时间:2015-02-05 11:49:52

标签: java hibernate jpa hibernate-4.x

我在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
}

感谢您提供的任何帮助。

0 个答案:

没有答案