【问题标题】:Difference between using @OneToMany and @ManyToMany使用 @OneToMany 和 @ManyToMany 的区别
【发布时间】:2012-01-01 21:08:55
【问题描述】:

我无法理解@OneToMany 和@ManyToMany 之间的区别。当我使用@OneToMany 时,它默认创建一个 JoinTable 并且如果您添加 mappedBy 属性,您将在两个实体之间建立双向关系。

我有一个Question 可能属于许多Categories,而一个Category 可能属于许多Questions。我不明白我是否应该使用@ManyToMany 或@OneToMany,因为对我来说这似乎完全一样,但可能不是。

谁能解释一下?

【问题讨论】:

    标签: java jakarta-ee jpa


    【解决方案1】:

    在您的问题和类别案例中,您应该使用 @ManyToMany 关系。 @ManyToMany 基本上意味着“一个问题可以同时属于多个类别”和“一个类别可以同时包含多个问题”。将自动创建一个新表来存储映射。您的代码如下所示:

    @Entity
    public class Question implements Serializable {
        ...
        @ManyToMany
        private List<Category> categories;
        ...
    }
    
    @Entity
    public class Category implements Serializable {
        ...
        @ManyToMany
        private List<Question> questions;
        ...
    }
    

    如果您对问题和类别使用@OneToMany 关系(假设一方面是类别,另一方面是问题),这意味着“一个问题只能属于一个类别”和“一个类别可以包含许多问题同时”。不需要新表来存储映射。相反,Many 端会自动创建一个新字段来记录 One 端的 ID。您的代码如下所示:

    @Entity
    public class Question implements Serializable {
        ...
        @ManyToOne
        private Category theCategory;
        ...
    }
    
    @Entity
    public class Category implements Serializable {
        ...
        @OneToMany(mappedBy="theCategory")
        private List<Question> questions;
        ...
    }
    

    【讨论】:

      【解决方案2】:

      嗯,不同之处在于您尝试使用对象反映的设计。

      在您的情况下,每个Question 都可以分配给多个Categories - 这是@*ToMany 关系的标志。现在你必须决定是否:

      • 每个Category 只能分配一个Question(这将导致唯一约束,这意味着没有其他类别可以引用相同的问题 ) - 这将是 @OneToMany 关系,
      • 每个Category 可以分配多个Questions(Category 表中没有唯一约束)- 这将是@ManyToMany 关系。

      @OneToMany(问题 -> 类别)

      只有当您使用@JoinTable 明确定义时,或者当它是一个单向关系,其中拥有方是“One”方(这意味着在Question 实体中,您拥有Categories 的集合,但在Categories 中,您没有对Question 的任何引用。

      如果你仔细想想,使用连接表似乎很合理。 DBMS 没有其他方法可以保存Question 表中的一行与Categories 表中的多行之间的连接。

      但是,如果您想为双向关系建模,则需要指定 Category(“多”方)是关系的拥有方。在这种情况下,DBMS 可以在Category 表中创建一个带有外键的连接列,因为每个Category 行只能与一个Question 连接。

      通过这种方式,您没有任何连接表,只有简单的外键(不过,正如开头所指出的,您可以使用@JoinTable 强制创建连接表)。

      @ManyToMany

      这种关系必须表示为一个连接表。它基本上与单向@OneToMany 关系非常相似,但在这种情况下,您可能有来自Question 的多行与来自Categories 的多行连接。

      【讨论】:

      • 很棒的解释。应该有更多的赞成票。
      【解决方案3】:

      @ManyToMany 关系在关系的两边都有相互引用的外键。有时,这种关系是由相邻的表来调节的。

      @OneToMany 关系在“一”端而不是“多”端有一个外键。在@OneToMany 关系中,一个对象是“父”,一个是“子”。父级控制子级的存在。

      请记住,@ManyToMany 双向关系不必是对称的!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-05
        • 2012-02-16
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多