2017-04-26 33 views
0

我試圖創建出版物和作者之間的一對多關係,但由於某些原因,當我堅持發佈時,作者持續存在,但聯接表是空。JPA2一對多空聯接表

Publication.java

@Id 
@Column(name="PUBLICATIONID") 
private String id; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "authorspublication", fetch = FetchType.EAGER) 
private Collection<Author> authors; 

Author.java

@Id 
@Column(name = "AUTHORID") 
private String authorid; 

@ManyToOne(optional = false, targetEntity = Publication.class) 
@JoinColumn(name = "authorspublication", referencedColumnName = "publicationid") 
private Publication authorspublication; 

DataParser.java

//pub is created - non managed 
//author is created - non managed 

author.setPublication(pub); 
pub.getAuthors().add(author); 

em.merge(pub); 

我不知道擁有雙方倒退,或者如果其他東西。

任何有識之士將不勝感激。

+0

我添加了持久性代碼。 JPA登錄部署不會引發錯誤或警告。我會將細節級別設置爲FINE並再次查看。 – Setix

+0

日誌中沒有任何內容。首先對所有出版物執行插入操作,然後對作者執行插入操作,但從不參考插入表格 – Setix

+0

您是否使用eclipse-link作爲JPA提供程序? – grizzly

回答

2

您正在使用@JoinColumn這表明你是在authors表使用FK列出版物鏈接到他們的作者。

如果要使用連接表,則需要刪除此連接表並使用@JoinTable註釋。不過,在我看來,你的映射方向是錯誤的。當然這種關係是從作者到出版物的OneToMany?對於這個問題,作者可以有很多出版物,出版物可以有多個作者?

然而,對於張貼的情況下,應該想:

public class Publication{ 

    @Id 
    @Column(name="PUBLICATIONID") 
    private String id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "publications", fetch = FetchType.EAGER) 
    private Collection<Author> authors; 
} 


public class Author{ 

    @Id 
    @Column(name = "AUTHORID") 
    private String id; 

    @ManyToOne 
    @JoinTable(name = "author_publications", joinColumn = @JoinColumn(name = "AUTHORID"), inverseJoinColumn = @JoinColumn(name = "PUBLICATIONID")) 
    private Publication publications; 
} 

然而,你可能想在作者改變出版領域出版的是收集和更換@OnetoMany@ManyToMany

0

您尚未將其定義爲使用@JoinTable;它當前正在使用外鍵,因此爲什麼不插入連接表。您需要

@JoinTable 

添加到一對多場(作者)。不要忘了刪除@JoinColumn,因爲這是對FK關係

+0

我從作者中刪除了實體發佈的引用,並執行了聯接表並且工作。我如何在Author中添加出版物參考並使其成爲雙向? – Setix

+0

雙向是當你指定「mappedBy」,就像你有(但刪除JoinColumn) –