【问题标题】:JPA2 One-To-Many Empty Join TableJPA2 一对多空连接表
【发布时间】:2017-09-24 02:25:27
【问题描述】:

我正在尝试在 Publications 和 Authors 之间创建一对多的关系,但是由于某种原因,当我持久化 Publications 时,Authors 会被持久化,但 Join 表是空的。

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

我不知道拥有方是倒退,还是其他原因。

任何见解将不胜感激。

【问题讨论】:

  • 我添加了持久化代码。 JPA 登录部署不会引发错误或警告。我将详细级别设置为 FINE 并再次查看。
  • 日志中没有任何内容。首先对所有 Publications 执行插入操作,然后是 Authors,但永远不会引用 Join Table
  • 您是否使用 eclipse-link 作为您的 JPA 提供程序?

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


【解决方案1】:

您尚未将其定义为使用@JoinTable;它当前正在使用外键,因此为什么不插入连接表。你需要添加

@JoinTable

到一对多字段(作者)。不要忘记删除 @JoinColumn,因为那是 FK 关系

【讨论】:

  • 我从 Author 中删除了实体 Publication 的引用,并做了连接表,这很有效。如何在 Author 中添加回出版物参考并使其成为双向?
  • 双向是当你指定“mappedBy”时,就像你有(但删除 JoinColumn)
【解决方案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;
}

但是,您可能希望将 Author 中的 Publication 字段更改为出版物集合,并将 @OnetoMany 替换为 @ManyToMany

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 2023-03-04
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2018-10-31
    • 2016-09-27
    • 2022-01-18
    相关资源
    最近更新 更多