2013-03-04 40 views
0

要求是父母被刪除時所有相關的孩子必須被刪除。當使用hibernate註釋刪除父母時,我面臨刪除孩子的問題我的父母表是Employee,子表是EmployeeProject子表具有在數據庫Employee_Number一個外鍵約束,問題是當我刪除父以下錯誤來了,請告訴我是感謝的映射問題使用hibernate註釋刪除父母之間的關係問題

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

回答

0

確保您在數據庫模式中也具有標記爲CASCADE的外鍵關係,假定這是您想要的。 Hibernate的級聯將負責刪除Hibernate對象,但它本身不會使DELETE將未被轉換爲對象的子記錄截斷到您的應用程序中。

+0

我已經使數據庫中的級聯和它的工作,但我不明白爲什麼它顯示查詢的父只「從員工刪除EMPLOYEE_NUMBER = ?」它沒有顯示刪除查詢的孩子可以ü請解釋它 – henrycharles 2013-03-04 07:32:26

+0

'CASCADE'意味着_the database_在子表上刪除你。我猜英語不是你的第一語言?級聯是瀑布所做的,所以刪除流向子級(和孫級)表。即使您查看服務器上執行的SQL,也不會看到這一點。它被包含在外鍵關係中,當它被標記爲「CASCADE」時。數據庫的默認值爲'RESTRICT',如果有子項,則刪除被拒絕。你可以自己刪除孩子,但效率不高,你不得不擔心孫子等。 – 2013-03-04 07:40:43

+0

感謝你解釋我很好。 – henrycharles 2013-03-04 08:41:12

0

嘗試此,

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

會嘗試使用主鍵要刪除的實驗,並在實際刪除之前加載:

+0

它是爲你工作 – PSR 2013-03-04 07:32:20

+0

其工作感謝給我的替代解決方案 – henrycharles 2013-03-04 08:55:15