如何解决Hibernate中的级联删除?

时间:2014-04-22 16:13:09

标签: java spring hibernate

我有三个实体。第一个是公司实体(见下文)。

@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;

第二个是员工

@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) 

我认为问题出在级联操作中,但我不确定。有人可以说我该如何解决它?

3 个答案:

答案 0 :(得分:2)

问题是由于Employee - HistoryRecord的关系造成的。 HistoryRecord上的employee属性不可为空。如果您希望在删除员工时删除HistoryRecord,则需要将cascade属性添加到Employee上的historyRecords的@OneToMany(mappedBy =“employee”)。

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

答案 1 :(得分: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中。

enter image description here

答案 2 :(得分:0)

更新公司类中的关系映射缺少级联。

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