3

我有以下情况要解决,但无法正常工作(尝试了 Hibernate 和 EclipseLink):

Table_1:
    Column_A is Primary Key
    ... some other columns do follow

.

Table_2:
Column_x is Primary Key and is Foreign Key to Table_1.Column_A
Column_y is Primary Key and is Foreign Key to Table_1.Column_A
Column_z is Primary Key

因此,表 2 具有复合主键。

我试图通过以下方式实现它:

class Table_1 {
  @Id int Column_A;
}

.

class Table_2 {
  @EmbeddedId PK key;

  @Embeddable class PK {
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_x",referencedColumnName="Column_A")
    int Column_x;

    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_y",referencedColumnName="Column_A")
    int Column_y;

    int Column_z;

    public boolean equals(Object O) { ... }
    public int hashCode() { ... } 
  }
}

但是,当我运行时,我从 EclipseLink 得到提示,在 @Embeddable 中我只能使用“基本”注释。因此,我的问题是如何解决上述绘制的场景?

我无权访问 Table_1 类的源代码,但必须按原样使用它。此外,很可能会有更多的类/表为 Table_1 建立外键。

4

2 回答 2

1

使用@IdClass。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0

@IdClass(PK.class)
class Table_2 {
    @Id
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_x",referencedColumnName="Column_A")
    Table_1 Column_x;

    @Id
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_y",referencedColumnName="Column_A")
    Table_1 Column_y;

    @Id
    int Column_z;

    public boolean equals(Object O) { ... }
    public int hashCode() { ... } 
  }
}

class PK {
    int Column_x;
    int Column_y;
    int Column_z;
}
于 2012-04-23T15:05:20.317 回答
0

使用@EmbeddedId 是对的(而不是@IdClass,它更适用于生成的ID 而不是外键)。我认为您的问题是您将这些 FK 声明为整数,而实际上应该将它们键入 Table_1 或 Table_2 类。

于 2015-12-30T19:23:01.133 回答