【问题标题】:@JoinColumn and mappedBy for owning side and reverse side@JoinColumn 和 mappedBy 用于拥有方和反方
【发布时间】:2019-11-14 17:58:25
【问题描述】:

我对休眠中的@JoinColumnmappedBy 有疑问,在我阅读了stackoverflow 和其他博客中的这么多帖子之后,我仍然感到困惑。

以这个为例,每个员工都有很多电子邮件,一个员工可以拥有很多电子邮件:

第一个声明: 电子邮件拥有方,因为它具有 Employee 表的外键,通常在关系中,“ “多”方是拥有方。

在hibernate中,对于双向关系:

员工

@Entity
@Table(name = "employee")
public class Employee{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "employee")
    private List<Email> emails = new ArrayList<>();

    //Constructors, getters and setters removed for brevity
}

电子邮件

@Entity
@Table(name = "email")
public class Email{

    @Id
    @GeneratedValue
    private Long id;

    private String email;

    @ManyToOne
    @JoinColumn(name = "employee_id")
    private Employee employee;

    //Constructors, getters and setters removed for brevity
}

所以根据我的阅读,通常@JoinColumn 在拥有方,mappedBy 在反面。

但我也从某处得知@JoinColumn 在反面,而mappedBy 在拥有方。

我一头雾水,哪个合适?

【问题讨论】:

    标签: database hibernate spring-boot jpa orm


    【解决方案1】:

    @JoinColumn 注释在拥有外键的类中维护。根据您的代码,电子邮件类将使用 @JoinColumn 注释指定外键引用。它实际上有助于两个表之间的映射,因为您通过此注解指定了桥接列名称“employee_id”。

    另一方面,mappedBy 仅用于启用实体之间的双向映射。因此,它应该用于反面(非拥有类)。

    【讨论】:

      【解决方案2】:

      用户 -> 资产(一对多)

      Employee.java

       @JsonBackReference
       @OneToMany(mappedBy="user",fetch=FetchType.LAZY)
       private List<Asset> asset = new ArrayList<>();
      

      资产.java

          @JsonManagedReference
          @ManyToOne(cascade = CascadeType.PERSIST)
          @JoinColumn(name="id", nullable = false)
          private User user;
      

      @JoinColumn

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

      mappedBy

      是否将删除操作应用于已从关系中删除的实体,并将删除操作级联到这些实体

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 2012-08-09
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多