У меня три объекта. Первый - это юридическое лицо компании (см. Ниже).
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@JoinColumn(name = "company_id")
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Employee> employees;
@OneToMany(mappedBy = "company")
private List<HistoryRecord> historyRecords;
Второй - Employee
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
@Column
String name;
@ManyToOne
@JoinColumn(name = "company_id", nullable = true)
private Company company;
@OneToMany(mappedBy = "employee")
private List<HistoryRecord> historyRecords;
Вот мой класс HistoryRecord
@Entity
public class HistoryRecord {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
@ManyToOne
@JoinColumn(name = "company_id")
Employee employee;
@ManyToOne
@JoinColumn(name = "employee_id")
Company company;
@Column(name = "hire_date")
Date hireDate;
@Column(name = "resign_date")
Date resignDate;
Когда я пытаюсь выполнить операцию удаления в Employee, я получаю эту ошибку
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [delete from employee where id=?]; constraint ["CONSTRAINT_12: PUBLIC.HISTORY_RECORD FOREIGN KEY(EMPLOYEE_ID) REFERENCES PUBLIC.EMPLOYEE(ID)
Я думаю, проблема в каскадной операции, но я не уверен. Кто-нибудь может сказать, как я могу это исправить?
Проблема связана с отношением Employee - HistoryRecord. Свойство employee в HistoryRecord не равно NULL. Если вы хотите, чтобы HistoryRecord был удален при удалении сотрудника, вам необходимо добавить атрибут cascade в @OneToMany (mappedBy = "employee") для historyRecords на Employee.
@OneToMany(mappedBy = "employee",cascade = CascadeType.REMOVE)
Обновление вашего сопоставления отношений в классе компании отсутствует в каскаде.
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<HistoryRecord> historyRecords;
ENDDM генерирует
ALTER TABLE "public"."project_group" ADD CONSTRAINT "mandant" FOREIGN KEY (mandant_id) REFERENCES "mandant" ("mandant_id") ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
для базы данных и
@OneToMany(cascade = CascadeType.REMOVE)
в Java.