Hibernate - 复合主键包含外键

时间:2017-07-31 14:38:39

标签: java hibernate jpa foreign-keys composite-key

我有类似的问题如下,但解决方案并没有解决我的问题。

hibernate composite Primary key contains a composite foreign key, how to map this

我正在尝试连接2个表,每个表都有一个带有部分外键引用的复合主键。

$this->input->set_cookie('ci_sm', 'test', 86400, '.some-domain.com');

在A:

Table A
--------
f1 (pk)
f2 (pk)
f3 (pk)
f4 (pk)

Table B
--------
f1 (pk, fk)
f2 (pk, fk)
f5 (pk)
f6 (pk)

I created A, APK, B, BPK

在BPK:

private Set<B> bSet;
@OneToMany(targetEntity=B.class, cascade = CascadeType.ALL, mappedBy= "bpk.a")    
public Set<MovesEntity> getBSet() {
    return bSet;
}

上述方法给了我这个例外:

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
    @JoinColumn(name="f1", referencedColumnName="f1", nullable=false, insertable=false, updatable = false),
    @JoinColumn(name="f2", referencedColumnName="f2", nullable=false, insertable=false, updatable = false)
})
public A getA() {
    return a;
}

你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

假设f1和F2唯一标识A并存在于APK中,您可以通过几种方式使用JPA 2.0的派生ID。最容易展示的是:

@Entity
@IdClass(BPK.class)
public class B {
  @ID
  String f5;
  @ID
  String f6;
  @ID
  @ManyToOne(fetch=FetchType.EAGER)
  @JoinColumns({
    @JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
    @JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
  })
  A a;
}

public class BPK {
  String f5;
  String f6;
  APK a;
}

这里的关键点是B有一个控制外围键字段f1和f2的A的引用,而A&#39; s的主键在B&#39; s主键中使用 - 与关系同名。映射它的另一种方法是使B&#39的PK成为嵌入式ID,但嵌入式ID仍然不能有引用映射,因此可能看起来:

@Entity
@IdClass(BPK.class)
public class B {
  @EmbeddedId
  BPK pk;
  @MapsId("apk")
  @ManyToOne(fetch=FetchType.EAGER)
  @JoinColumns({
    @JoinColumn(name="f1", referencedColumnName="f1", nullable=false),
    @JoinColumn(name="f2", referencedColumnName="f2", nullable=false)
  })
  A a;
}

@Embeddable
public class BPK {
  String f5;
  String f6;
  APK apk;
}

注意mapsId - 这告诉JPA嵌入式&#39; apk中的列。 reference使用从A引用的引用映射中的外键字段.JPA将从引用映射中为您填充外键,如果您使用的是排序,则非常重要。