JPA @SecondaryTable 外键违规
Posted
技术标签:
【中文标题】JPA @SecondaryTable 外键违规【英文标题】:JPA @SecondaryTable foreign key violation 【发布时间】:2012-10-23 17:10:00 【问题描述】:我想以one to many
方式映射两个实体。
A->[B, B]
我想向join table
添加更多字段。 Pojos
看起来像:
@Entity
@Table(name = "A", schema = "examples")
@SecondaryTable(name = "A_B", pkJoinColumns = @PrimaryKeyJoinColumn(name = "a_id", referencedColumnName = "id"))
public class A
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Basic
private String name;
@Basic
private Integer field1;
@Column(table = "A_B", name = "field2")
private Integer field2;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "a_id"), inverseJoinColumns = @JoinColumn(name = "b_id"))
private List<B> datastores;
@Entity
@Table(name = "B", schema = "examples")
@SecondaryTable(name = "A_B", pkJoinColumns = @PrimaryKeyJoinColumn(name = "b_id", referencedColumnName = "id"))
public class B
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Basic
private String field1;
@Basic
private int field2;
@Column(table = "A_B", name = "field3")
private int field3;
问题是,为了添加,我必须删除 A_B
表上的 foreign key
。如何解决映射以允许 foreign keys
?
谢谢。
【问题讨论】:
【参考方案1】:我遗漏了一些东西,但我不明白为什么实体 A 和实体 B 都映射到表“A_B”。通过将其作为辅助表添加到实体 A 中,您是在声明每次对表 a 进行插入时,也必须对表 A_B 进行插入 - 在两个表中的行之间创建严格的 1:1 关系。除了你对实体 B 做同样的事情,所以你最终会得到 A_B 中的行,A_id=somevalue,B_id=null 和其他的 a_id=null 而 b_id=somevalue。表“A_B”看起来像一个关系表,所以这可能不是您想要的。
如果 A_B 是一个关系表,您应该使用 ManyToMany 映射它,就像“A_B”表一样。如果有额外的字段需要填充,创建一个 AB Entity,从 A->AB 和 B->AB 创建一个 OneToMany,从 AB->A 和 AB->B 创建一个 ManyToOne。
【讨论】:
以上是关于JPA @SecondaryTable 外键违规的主要内容,如果未能解决你的问题,请参考以下文章
在JPA SecondaryTable中以N:1关系保存相同的列
以 N:1 关系在 JPA SecondaryTable 中保存同一列