java - 如何解决Hibernate中的级联删除问题?

标签 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;

当我尝试对员工执行删除操作时,出现此错误

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) 

我认为问题出在级联操作中,但我不确定。有人可以告诉我如何修复它吗?

最佳答案

问题是由于 Employee -- HistoryRecord 的关系引起的。 HistoryRecord 上的员工属性不可为空。如果您希望在删除员工时删除 HistoryRecord,则需要为 Employee 上的 HistoryRecords 添加级联属性 @OneToMany(mappedBy = "employee")。

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

关于java - 如何解决Hibernate中的级联删除问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23224829/

相关文章:

java - (没有为参数4指定值)多对多关系错误

java - Spring Servlet 映射困惑

hibernate - 为什么 JPA 中 @SequenceGenerator 注释的默认 allocationSize 属性是 50?

hibernate - javax.persistence.PersistenceException : No Persistence provider for EntityManager named

java - 如何参数化 Hibernate Constraint 消息以包含字段名称?

Java - 重写方法时关键字 this 的范围

java - @Transactional(rollbackfor=Exception.class) 用于两个 daoimpl 类

java - 用于 emacs 的最佳 Java 工具

java - 如何中断当前正在运行的线程?

java - 来自 PostgreSQL 序列的 nextVal 在 Hibernate 中多次获取序列