hibernate composite主键包含一个复合外键,如何映射这个

Ken*_*ent 8 java hibernate hibernate-annotations

我在那里搜索,没有找到任何类似的话题,所以我发布了一个新问题.

我正在使用现有数据库上的Hibernate.我们不允许更改表结构和数据.应用程序正在从数据库中读取数据,并根据某些逻辑迁移到另一个数据存储区.

现在问题是关于复合PK映射.例如

表A具有复合PK.

Table A
--------
a1 (pk)
a2 (pk)
a3 (pk)
a4 (pk)
foo
bar
========
Run Code Online (Sandbox Code Playgroud)

表B也具有复合PK,并且该复合PK的一部分是A的PK,这里也用作FK.

Table B
--------
a1 (fk,pk)
a2 (fk,pk)
a3 (fk,pk)
a4 (fk,pk)
b1 (pk)
b2 (pk)
b3 (pk)
foo
bar
========
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,但没有一种方法可行.谁能告诉一个有效的Hibernate映射解决方案?注释风格更好.

Vin*_*ian 10

在B的pk类中将A的实体对象设置为@ManyToOne.

所以,如果你有

Class A
Class APK - A's Primary Key

Class B
Class BPK - B's primary Key.
Run Code Online (Sandbox Code Playgroud)

BPK将包含A作为属性

@Embeddable
public class BPK implements serializable {
  ....
  private A a;

  @ManyToOne(fetch=FetchType.EAGER)
  @JoinColumns ({
    @JoinColumn(name="...", referencedColumnName = "..."),
    @JoinColumn(name="...", referencedColumnName = "..."),
    ...
  })
  public getA() {
    return this.a;
  }
}
Run Code Online (Sandbox Code Playgroud)

文档中

@Embeddable继承其拥有实体的访问类型,除非使用Hibernate特定注释@AccessType.复合外键(如果不使用默认敏感值)是在使用@JoinColumns元素的关联上定义的,该元素基本上是@JoinColumn的数组.明确表达referencedColumnNames是一种很好的做法.否则,Hibernate将假设您使用与主键声明中相同的列顺序.