2017-09-03 76 views
0

我是JPA的新手。假设我有两个实体:@OneToMany不创建连接表

//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;} 

我想有像购买包含了许多文章。

我的问题是:购买类中只有@OneToMany是否可能指向文章类具有所需关系(购买包含许多文章)。或者使用@OneToMany注释,我必须在Article类上添加@ManyToOne。如果是这样,为什么必须添加@ManyToOne?请任何解释。 在此先感谢。

+0

是肯定的。如果文章没有意义,文章不需要保留购买。你试过了吗?它应该正常工作 –

+0

@JackFlamp多数民众赞成在我试过它的问题,并没有发生变化发生在表中:/没有增加 – ziMtyth

+0

所以你坚持和没有发生?您是否可以保存购买,但文章没有保存,是什么意思? –

回答

1

首先,我必须写一个标题误导,我会改变它,使之更准确:

旧标题:在JPA中,是有可能使用@OneToMany不使用@ManyToOne?

新标题: @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; 

} 

UPDATE:

我有一个第三表中创建包含购买和文章的ID(连接表),这显然是不正确的。

正常的“行为”是在Article中添加id_purchase列,在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; 

}