使用hibernate注释删除父对子关系的问题

时间:2013-03-04 07:14:52

标签: hibernate hibernate-mapping hibernate-annotations

要求是删除父项时必须删除所有相关的子项。当使用hibernate注释删除父项时我面临删除子项的问题我的父表是Employee而子表是EmployeeProject子项table在数据库中有一个Employee_Number的外键约束,问题是当我删除父句后面的错误即将来临请告诉我映射中的问题在哪里谢谢

  Hibernate: select employee_.EMPLOYEE_NUMBER, employee_.ADDRESS_1 as ADDRESS2_0_, employee_.ADDRESS_2 as ADDRESS3_0_, employee_.CITY as CITY0_, employee_.DATE_OF_ANNIVERSARY as DATE5_0_, employee_.DATE_OF_BIRTH as DATE6_0_, employee_.DATE_OF_JOINING as DATE7_0_, employee_.DATE_OF_LEAVING as DATE8_0_, employee_.DEPARTMENT_ID as DEPARTMENT9_0_, employee_.FIRST_NAME as FIRST10_0_, employee_.LAST_NAME as LAST11_0_, employee_.MOBILE_NUMBER as MOBILE12_0_, employee_.pincode as pincode0_, employee_.REASON_FOR_LEAVING as REASON14_0_, employee_.state as state0_, employee_.TELEPHONE_NUMBER as TELEPHONE16_0_, employee_.TITLE as TITLE0_ from Employees employee_ where employee_.EMPLOYEE_NUMBER=?
Hibernate: delete from Employees where EMPLOYEE_NUMBER=?
4 Mar, 2013 12:33:32 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1451, SQLState: 23000
4 Mar, 2013 12:33:32 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot delete or update a parent row: a foreign key constraint fails (`employee/employee_project`, CONSTRAINT `FKC1804A88229473A9` FOREIGN KEY (`EMPLOYEE_NUMBER`) REFERENCES `employees` (`EMPLOYEE_NUMBER`))

这是我的父映射

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)
    Collection<EmployeeProject> employeeProjects = new ArrayList<EmployeeProject>();

这是子表映射

    @ManyToOne
    @JoinColumn(name = "EMPLOYEE_NUMBER", insertable = false, updatable = false)
    Employee employee;

这是删除父(员工)的方法

@Override
public boolean deleteEmployee(Employee employee) {

    Transaction transaction = null;
    boolean flag;
    try {
        transaction = session.beginTransaction();
        session.delete(employee);
        transaction.commit();
        flag = true;

    } catch (HibernateException exception) {
        if (transaction != null)
            transaction.rollback();
        flag = false;
    }
    return flag;
}

2 个答案:

答案 0 :(得分:0)

试试这个,

          t = session.beginTransaction();
      ExperimentImpl persistentExperiment = session.load(Employee.class, 
             employee.getId());
    session.delete(persistentExperiment);
    t.commit();

会尝试使用您要删除的实验的主键,并在实际删除它之前加载:

答案 1 :(得分:0)

确保您还在数据库架构中将外键关系标记为CASCADE,假设这是您想要的。 Hibernate的级联将负责删除Hibernate对象,但它本身不会将尚未转换为对象的DELETE kill子记录转换为应用程序。