inserttable = false помещает ноль в мое значение, но true выдает ошибку (отношение многие ко многим) - PullRequest
0 голосов
/ 16 апреля 2019

у меня 3 таблицы. Больницы и врачи. Третья таблица представляет собой соединительную таблицу, которая содержит идентификаторы, идентификаторы двух других таблиц в качестве внешних ключей и несколько других столбцов. При попытке поместить запись в соединительную таблицу я получил сообщение об ошибке, что один из внешних ключей должен быть установлен с inserttable = false. Однако, когда я устанавливаю это так, я получаю, что значение не может быть нулевым (поскольку моей базе данных требуется это поле). Я застрял и не могу идти дальше с этими двумя ошибками.

Если мне удается избежать этих двух ошибок, я получаю сообщение об ошибке, что в списке полей есть неизвестный столбец.

Врач сущность:

@Entity
@Table(name = "doctors")
public class Doctors implements Serializable {


    private Integer id;
    private String name;
    private String surname;
    private String title;
    private String licenseNumber;
    private String phone;
    private String email;
    private String nationality;
    private String speciality;
    private LocalDate dateOfBirth;
    private Boolean isATeacher;
    private List<HospitalDoctors> hospitalDoctors = new LinkedList<>();

//consturctors

@Id
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    @Column(name = "Idd", nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
//setters and getters for rest of the fields with @column annotations on getters

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.doctor", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
    public List<HospitalDoctors> getHospitalDoctors() {
        return hospitalDoctors;
    }

    public void setHospitalDoctors(List<HospitalDoctors> hospitalDoctors) {
        this.hospitalDoctors = hospitalDoctors;
    }

Больница:

@Entity
@Table(name = "hospitals")
public class Hospitals implements Serializable {

    private Integer id;
    private String name;
    private String country;
    private String town;
    private String street;
    private String postalCode;
    private String phoneNumber;
    private String faxNumber;
    private Integer numberOfAmbulances;
    private Boolean helicopterAccess;
    private Boolean teachingHospital;
    private List<HospitalDoctors> hospitalDoctors = new LinkedList<>();
//constructors

@Id
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    @Column(name = "Idh", nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
//getters setters with @column annotations over getters
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.hospital", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
    public List<HospitalDoctors> getHospitalDoctors() {
        return this.hospitalDoctors;
    }

    public void setHospitalDoctors(List<HospitalDoctors> hospitalDoctors) {
        this.hospitalDoctors = hospitalDoctors;
    }

Сущность соединительной таблицы:

@Entity
@Table(name = "hospitaldoctors")
@AssociationOverrides({
        @AssociationOverride(name = "pk.hospital",
                joinColumns = @JoinColumn(name = "Idh")),
        @AssociationOverride(name = "pk.doctor",
                joinColumns = @JoinColumn(name = "Idd"))
})
public class HospitalDoctors implements Serializable {

    private Integer id;
    private Integer idH;
    private Integer idD;
    private HospitalDoctorsId pk = new HospitalDoctorsId();
    private LocalDate contractStartDate;
    private LocalDate contractEndDate;
    private String position;
    private Boolean supervisor;
    private Boolean partTime;
//constructors
 @Column(name ="Idhos")
    public Integer getIdH() {
        return this.idH;
    }

    public void setIdH(Integer idH) {
        this.idH = idH;
    }
    @Column(name ="Iddoc")
    public Integer getIdD() {
        return this.idD;
    }

    public void setIdD(Integer idD) {
        this.idD = idD;
    }

    @EmbeddedId
    public HospitalDoctorsId getPk() {
        return pk;
    }

    public void setPk(HospitalDoctorsId pk) {
        this.pk = pk;
    }

    @Transient
    public Hospitals getHospital(){
        return getPk().getHospital();
    }

    public void setHospital(Hospitals hospital){
        getPk().setHospital(hospital);
    }

    @Transient
    public Doctors getDoctor(){
        return getPk().getDoctor();
    }

    public void setDoctor(Doctors doctor){
        getPk().setDoctor(doctor);
    }
//rest of the setters getters with @Column
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        HospitalDoctors that = (HospitalDoctors) o;
        if(getPk() != null?!getPk().equals(that.getPk()) : that.getPk() != null) return false;
        return true;
    }

    @Override
    public int hashCode() {
        return (getPk() != null? getPk().hashCode() : 0);
    }

Идентификатор соединительной таблицы:

@Embeddable
public class HospitalDoctorsId implements Serializable {

    private Hospitals hospital;
    private Doctors doctor;

    @ManyToOne
    public Hospitals getHospital() {
        return hospital;
    }

    public void setHospital(Hospitals hospital) {
        this.hospital = hospital;
    }

    @ManyToOne
    public Doctors getDoctor() {
        return doctor;
    }

    public void setDoctor(Doctors doctor) {
        this.doctor = doctor;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        HospitalDoctorsId that = (HospitalDoctorsId) o;
        if(hospital != null?!hospital.equals(that.hospital) : that.hospital != null) return false;
        if(doctor != null?!doctor.equals(that.doctor) : that.doctor != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result;
        result = (hospital != null? hospital.hashCode() : 0);
        result = 31* result + (doctor != null? doctor.hashCode() : 0);
        return result;
    }
}

Я ожидал, что смогу добавить записи в таблицу соединений в базе данных в полях формы. У меня есть внешние ключи для больницы и идентификатора врачей, которые нужно вставить, а также другие поля. К сожалению, я получаю любую ошибку, в которой говорится, что столбцы внешних ключей idD и idH помещаются как вставляемые, обновляемые false, что приводит к передаче нулевого значения, что приводит к другой ошибке. Когда я решаю эти ошибки, я получаю сообщение об ошибке: java.sql.SQLSyntaxErrorException: неизвестный столбец 'hospitaldo0_.Idd' в 'списке полей' при попытке отобразить записи и неизвестный столбец Idd при попытке добавить запись (отображение работает, когда я получаю вставляемую ошибку или ошибку нулевого значения. добавление никогда не работает)

1 Ответ

0 голосов
/ 16 апреля 2019

Если я правильно помню, вам нужно иметь одно отношение @ManyToMany, а не два отношения @OneToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...