【问题标题】:JPA: Foreign key in embeddable classJPA:可嵌入类中的外键
【发布时间】:2012-04-23 13:28:54
【问题描述】:

我有以下情况要解决,但无法正常工作(尝试了 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 建立外键。

【问题讨论】:

    标签: jpa


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 2011-01-22
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        相关资源
        最近更新 更多