0

我想以一种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

谢谢。

4

1 回答 1

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 Entity,并从 A->AB 和 B->AB 创建一个 OneToMany,从 AB->A 和 AB->B 创建一个 ManyToOne。

于 2012-10-23T18:35:50.930 回答