JPA2一对多空连接表

时间:2017-04-26 15:22:01

标签: java jpa java-ee jpa-2.0 ejb-3.0

我试图在出版物和作者之间创建一对多的关系,但是出于某种原因,当我坚持出版时,作者会被持久化,但是加入表是空的。

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);

我不知道拥有双方是否倒退,或者是否还有别的东西。

任何见解都将受到赞赏。

2 个答案:

答案 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关系