我遇到了一个问题,我不知道是否可以通过使用hibernate / jpa注释来解决。问题是我有一个复合键,它与我的一个外键复合id具有相同的列,我想在表上共享同一列。例如:
@Entity
class Id {
@Id
@Column(name = "idPessoa")
public Integer idShared;
}
@Embeddable
class APK {
@ManyToOne
@JoinColumn(name = "idShared")
public Id idShared;
public String nKey;
}
@Entity
class A {
@EmbeddedId
public APK id;
}
@Embeddable
class BPK {
@ManyToOne
@JoinColumn(name = "idShared")
public Id idShared;
public Integer nCode;
}
@Entity
class B {
@EmbeddedId
public BPK id;
@ManyToOne
@JoinColumns({ @JoinColumn(name = "idShared", nullable = false, insertable = false, updatable = false), @JoinColumn(name = "nKey", nullable = false) })
public A a;
}
问题是如何在A和B之间共享列idShared并在@ManyToOne中使用它作为外键?
我已经尝试在名称为idShared的@JoinColumns中使用@JoinColumn,但是我收到错误,说我需要使用insert = false和update = false,我已经把insertable = false和updateable = false,但后来我得到另一个错误,说我不能混合。
我找到了一个可能使用的解决方案:
@ManyToOne
@JoinColumnsOrFormulas(value = {
@JoinColumnOrFormula(formula = @JoinFormula(value = "idShared", referencedColumnName = "idShared")),
@JoinColumnOrFormula(column = @JoinColumn(name = "nKey", nullable = false)) })
public A a;
但它给了我错误:
Unable to find column with logical name in table A
看来它必须找到的列的“name”属性是空白的。
需要一些帮助!
答案 0 :(得分:0)
请查看Official Java EE 6 Tutorial about composite primary key。您可以使用@EmbeddedId
@Embeddable
和/或@IdClass
注释。
例如
// File: APK.java ---------------------
@Embeddable
public class APK implements Serializable {
public Integer idShared;
public String nKey;
}
// File: A.java ---------------------
@Entity
public class A {
@EmbeddedId public APK id;
}