什么是 @JoinColumn 以及它在 Hibernate 中的使用方式

新手上路,请多包涵

我已经阅读了很多关于@JoinColumn 的文章,但我仍然不明白它背后的想法。

病人表

CREATE TABLE patient (
patient_id BIGINT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
PRIMARY KEY(patient_id));

车辆表

CREATE TABLE vehicles (
patient_id BIGINT NOT NULL,
vehicle_id BIGINT NOT NULL,
vehicle_manufacturer VARCHAR(255),
PRIMARY KEY (vehicle_id),
CONSTRAINT patienthasmanyvehicle FOREIGN KEY(patient_id) REFERENCES patient(patient_id));

病人等级

@OneToMany(mappedBy = "patient")
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>();

车辆类别

@ManyToOne
@JoinColumn(name="patient_id")
private Patient patient;

我对 Vehicle 类的部分感到困惑,它们之间的关系是什么

Vehicle Class ---- Entity
@JoinColumn(name="patient_id") ---- annotation
private Patient patient ----field

它说; Vehicle 实体 有一个指向名为 patient_idPatient 实体外键。将 patient_id 添加为 Vehicle Entity 表 中的一列

JoinColumn 的名称参数应该始终是 外键还是主键?

我一直在读这个,但我仍然很困惑。 JPA JoinColumn 与 mappedBy

原文由 zbryan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 829
1 个回答

通过连接表的单向关联

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

通过连接表的双向关联

@Entity
class Patient {

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

}

@Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    private Patient patient;

}

通过外键的单向关联

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

通过外键的双向关联

@Entity
class Patient {

    @OneToMany(mappedBy = "patient")
    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();

}

@Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    private Patient patient;

}

我们不需要在 Vehicle 端使用 @JoinColumn ,Hibernate 默认采用它。有时我只是用它来强调它(另一种情况,当我们想指定一个连接列名时)。

     @Entity
    class Vehicle {

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn
        private Patient patient;

    }

通过外键与外列名称规范的双向关联

@Entity
class Patient {

    @OneToMany(mappedBy = "patient")
    private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();

}

@Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="patient_id")
    private Patient patient;

}

这是使用 @JoinColumn 的基本起点。

要验证外键( patient_idVehicle 表中)是否真的映射到患者表中,你可以使用 @JoinColumn(nullable = false)

 @Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="patient_id", nullable = false)
    private Patient patient

}

原文由 v.ladynev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题