Как разрешить каскадное удаление в Hibernate?

1

У меня три объекта. Первый - это юридическое лицо компании (см. Ниже).

@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 [&quot;CONSTRAINT_12: PUBLIC.HISTORY_RECORD FOREIGN KEY(EMPLOYEE_ID) REFERENCES PUBLIC.EMPLOYEE(ID) 

Я думаю, проблема в каскадной операции, но я не уверен. Кто-нибудь может сказать, как я могу это исправить?

Теги:
spring
hibernate

3 ответа

2
Лучший ответ

Проблема связана с отношением Employee - HistoryRecord. Свойство employee в HistoryRecord не равно NULL. Если вы хотите, чтобы HistoryRecord был удален при удалении сотрудника, вам необходимо добавить атрибут cascade в @OneToMany (mappedBy = "employee") для historyRecords на Employee.

@OneToMany(mappedBy = "employee",cascade = CascadeType.REMOVE)
0

Обновление вашего сопоставления отношений в классе компании отсутствует в каскаде.

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<HistoryRecord> historyRecords;
0

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.

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню