将记录添加到联结表JPA

时间:2018-02-24 17:05:17

标签: mysql database hibernate jpa spring-boot

我在使用JPA + Hibernate

添加记录到联结表时遇到问题

The schema is

当我尝试使用POST请求添加简单记录时,它会抛出一个错误:

  

“message”:“无法执行语句; SQL [n / a];约束[null];嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行语句”

在我的控制台中:

  

MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败*

我已经定义了加入列@JoinColumn(insertable=false, updatable=false),因为Hibernate要求它,否则它会抛出我应该这样做的错误......

这是我的联结实体代码:

    @Entity
@Table(name = "hospital_doctor")
@IdClass(Hosdoc.class)
public class HospitalDoctor implements Serializable {

    @Id
    private int hospitalId;

    @Id
    private int doctorId;


    // fields of hospitalDoctor table

    @Temporal(TemporalType.DATE)
    private Date contractStartDate;
    @Temporal(TemporalType.DATE)
    private Date contractEndDate;
    private String position;
    private String supervisor;
    private boolean partTime;

    @ManyToOne
    @JoinColumn(name="HospitalId", insertable = false, updatable = false)
    private Hospital hospital;

    @ManyToOne
    @JoinColumn(name="DoctorId", insertable = false, updatable = false)
    private Doctor doctor;

// GETTERS AND SETTERS....

我在医院类中编写了简单的添加功能但我不知道如何使用它通过POST请求将记录添加到联结表。

public void addDoctor(Doctor doctor, boolean partTime, Date contractEndDate, Date contractStartDate,
            String position, String supervisor) {
        HospitalDoctor association = new HospitalDoctor();
        association.setDoctor(doctor);
        association.setHospital(this);
        association.setDoctorId(doctor.getId());
        association.setHospitalId(this.getId());
        association.setContractStartDate(contractStartDate);
        association.setContractEndDate(contractEndDate);
        association.setPosition(position);
        association.setSupervisor(supervisor);
        association.setPartTime(partTime);

        doctors.add(association);
    }

服务:

    public void addHospitalDoctor(HospitalDoctor hospitalDoctor) {
    hospitalDoctorDao.save(hospitalDoctor);
}

控制器:

        @PostMapping(value = "/api/hospitaldoctors")
    public void addHospitalDoctor(HospitalDoctor hospitalDoctor) {
        hospitalDoctorService.addHospitalDoctor(hospitalDoctor);
    }

0 个答案:

没有答案