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 中保存同一列

NHibernate 多对多删除导致外键违规

Spring Data JPA主键违规约束不起作用

如何在 Laravel 5.1 完整性约束违规中添加外键:1452?

如何从具有外键类型的jpa存储库返回选择查询