【问题标题】:When Should I Use @JoinColumn or @JoinTable with JPA?我什么时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?
【发布时间】:2015-07-29 02:06:14
【问题描述】:

@JoinColumn 为另一个Entity 提供了一个外键Entity@JoinTable 将列出Entity A 和Entity B 之间的所有关系之间的关系。据我所知,它们都是似乎在做类似的事情。我应该什么时候使用其中一种?

【问题讨论】:

    标签: java hibernate jpa orm hibernate-mapping


    【解决方案1】:

    假设您有一个实体A,它有一个@ManyToOne 关联或一个实体B

    @JoinColumn 将在使用目标实体表(例如B)时定义目标表外键(例如B_ID)。

    @Entity
    public class A {
    
        private Long id;
    
        @ManyToOne
        @JoinColumn(name="B_ID")
        private B b;
    
    }
    

    @JoinTable 将使用一个单独的表来保存AB 之间的关系。

    @Entity
    public class A {
    
        private Long id;
    
        @ManyToOne
        @JoinTable(
           name = "A_B", 
           joinColumns = @JoinColumn(name = "B_ID"), 
           inverseJoinColumns = @JoinColumn(name = "A_ID")
        )
        private B b;
    
    }
    

    这次AB 都不包含任何外键,因为有一个单独的表(例如A_B)来保存AB 之间的关联。

    【讨论】:

    • 所以 JoinTable 是 N-N 关系?
    • 在数据库术语中,它是多对多关联。在这种情况下,一个 FK 将有一个唯一的约束来将其转换为与连接表的一对多关联。
    【解决方案2】:

    @JoinTable 将两个表的 id 存储到一个单独的表中,而 @JoinColumn 将另一个表的 id 存储在一个新列中。

    @JoinTable :这是默认类型。当您需要更规范化的数据库时使用它。 IE。以减少冗余。

    @JoinColumn :使用它可以获得更好的性能,因为它不需要加入额外的表。

    【讨论】:

      【解决方案3】:

      一个重要的区别@JoinColumn 总是使用depends upon the context

      • 如果联接是针对使用外键映射策略的 OneToOne 或 ManyToOne 映射,则外键列在
        源实体或嵌入。
      • 如果连接是针对使用外键映射策略的单向 OneToMany 映射,则外键位于 目标实体。
      • 如果连接是针对多对多映射或单对一或使用连接表的双向多对一/单对多映射,则
        外键在连接表中。
      • 如果连接用于元素集合,则外键位于集合表中。

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2021-09-07
        • 1970-01-01
        • 2016-11-01
        相关资源
        最近更新 更多