我试图在出版物和作者之间创建一对多的关系,但是出于某种原因,当我坚持出版时,作者会被持久化,但是加入表是空的。
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 :(得分: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
答案 1 :(得分:0)
您尚未将其定义为使用@JoinTable
;它当前正在使用外键,因此没有插入到连接表中。你需要添加
@JoinTable
到一对多字段( authors )。不要忘记删除@JoinColumn
,因为这是为了FK关系