【问题标题】:Hibernate One to many relationshipHibernate 一对多关系
【发布时间】:2021-02-16 03:50:27
【问题描述】:

我在hibernate中寻找不同的关系形成可能性,我遇到了下面的代码sn-p

@Entity
@Table(name="patient")
class Patient {

    @OneToMany
    @JoinColumn
    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();

}

@Entity
@Table(name="vehicle")
class Vehicle {

}

这里有一个从患者到车辆的 1:n 关系。我们在 Patient 类中添加了一个车辆集合。到目前为止完美。所以我的疑问是,如果我们在 Patient 类中添加 @JoinColumn 注释,在车辆集合上方,我们会在“患者”表中得到一个列,它引用(vehicle_id)“车辆”表的主键。因此,如果一个患者有多个车辆,那么患者表中将有 2 个具有相同患者 ID 的元组。那么它会违反主键约束吗? 如果您感到困惑,我将提供带有一些示例数据的表格的屏幕截图。 那么是否允许在 Patient 类中写 @JoinColumn 注解呢?

【问题讨论】:

    标签: java sql hibernate orm one-to-many


    【解决方案1】:

    您也可以在患者类中使用@JoinTable,就像这样

     @OneToMany
     @JoinTable(
            name = "vehicle",
            joinColumns = @JoinColumn(name = "vehicle_id"),
            inverseJoinColumns = @JoinColumn(name = "patient_id"))
    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
    

    如果你在@JoinTable 注解中没有提到inverseJoinColumns,持久化提供者会假设一个主键连接到主键

    但是根据屏幕截图,您的患者表在我看来有点奇怪,因为它看起来患者 ID 是重复的,而根据您的问题,它应该是一个拥有多辆车的患者

    【讨论】:

      【解决方案2】:

      是的,您可以在 Patient 实体中添加 @JoinColumn,这将引用不在 Patient 类中而是在 Vehicle 类中的列,例如车辆表:

      |  id   |  patient_id |
      |   1   |    1        |
      |   2   |    1        |
      
      
      
      @Entity
      @Table(name="patient")
      class Patient {
          @OneToMany
          @JoinColumn(name="patient_id")
          private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
      
      }
      
      @Entity
      @Table(name="vehicle")
      class Vehicle {
          @Column(name="patient_id")
          private Integer patientId;
      }
      

      【讨论】:

      • 我在想@JoinColumn 注释会在我们应用该注释的实体表上创建一个连接列。
      猜你喜欢
      • 1970-01-01
      • 2015-02-05
      • 2011-12-15
      • 2011-09-30
      • 1970-01-01
      • 2020-12-26
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多