JPA @SecondaryTable外键违规

时间:2012-10-23 17:10:01

标签: java hibernate jpa orm mapping

我想以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;
}

为了添加,我必须删除foreign key表上的A_B。如何解决映射以允许foreign keys

感谢。

1 个答案:

答案 0 :(得分:2)

我遗漏了一些东西,但我不明白为什么实体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实体,并从A-&gt; AB和B-&gt; AB创建OneToMany,并从AB-&gt; A和AB-&gt; B创建ManyToOne。