@OneToMany不会创建连接表

时间:2017-09-03 13:17:13

标签: java jpa entity one-to-many many-to-one

我是JPA的新手。假设我有这两个实体:

//Imports

@Entity
@Table(name="article", schema = "sch_client")
public class Article implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int price;
    private int amount;

    //Getters & setters
}

@Entity
@Table(name="purchase", schema = "sch_client")
public class Purchase implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToMany
    private List<Article> listArticle;}

我希望像购买这样的东西包含很多文章。

我的问题是:是否可以在Purchase类中仅@OneToMany指向Article类具有所需的关系(购买包含许多文章)。或者要使用@OneToMany注释,我必须在Article类上添加@ManyToOne。如果是这样,为什么必须添加@ManyToOne?请解释一下。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先,我写了一个误导性的标题,我会改变它以使其更准确:

旧标题:在JPA中,是否可以在不使用@ManyToOne的情况下使用@OneToMany?

新标题: @OneToMany不会创建联接表。

正如我所说的,我是JPA的新手,我的问题可能显得愚蠢,我可以删除这个问题,但我决定保留它以防有人有一天会面临类似的情况,它可以帮助!

每次我非常正常地执行代码时都会创建Purchase和Article的连接表,但我没注意到!我正在检查NetBeans的日志 并且没有看到连接表,我被这些日志误导了,我认为连接表没有出现在日志中(我希望有人可以确认这些信息并编辑这个答案)。

我在名为:sch_sales的新架构中创建了Purchase和Article。并且连接表是在公共模式(PostgreSQL)中创建的。

所以,为了使它更正确,我将架构添加到@JoinTable,如下所示,像这样我将把所有表放在同一个架构中。

@Entity
@Table(name="purchase", schema = "sch_sales")
public class Purchase implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToMany
    @JoinTable(name="join_purchase_article", schema = "sch_sales", joinColumns = @JoinColumn(name="sales_fk"), inverseJoinColumns = @JoinColumn(name="article_fk"))
    private List<Article> listArticle;

 }

更新:

我创建的第3个表包含了Purchase和Article(连接表)的ID,显然不正确。

正常的“行为”是在id_purchase中添加Article列,在此page我已找到如何获得此类结果。

为了获得所需的结果,我使用了以下代码:

@Entity
@Table(name="purchase", schema = "sch_sales")
public class Purchase implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToMany
    @JoinColumn(name="id_purchase")
    private List<Article> listArticle;

 }