2012-10-23 87 views
0

我想以one to many的方式映射兩個實體。JPA @SecondaryTable外鍵違例

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

謝謝。

回答

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-> AB和B-> AB創建OneToMany,並從AB-> A和AB-> B創建一個OneToMany。