一尘不染

Hibernate复合主键包含复合外键,如何映射

hibernate

我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。

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

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

表A具有复合PK。

Table A
--------
a1 (pk)
a2 (pk)
a3 (pk)
a4 (pk)
foo
bar
========

表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
========

我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hibernate映射解决方案?注释样式更好。


阅读 250

收藏
2020-06-20

共1个答案

一尘不染

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

所以如果你有

Class A
Class APK - A's Primary Key

Class B
Class BPK - B's primary Key.

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;
  }
}

文档中

@Embeddable继承其所属实体的访问类型,除非使用了Hibernate特定的注释@AccessType。使用@JoinColumns元素在关联上定义复合外键(如果不使用默认敏感值),该元素基本上是@JoinColumn的数组。显式表示referencedColumnNames被认为是一种好习惯。否则,Hibernate将假定您使用与主键声明中相同的列顺序。

2020-06-20