2015-08-21 88 views
4

我正在處理基本示例以測試cascade delete操作,但我收到異常。Hibernate拋出無法刪除或更新父行:外鍵約束失敗

我有以下實體:

Employee.java

@Entity 
public class Employee { 
    @Id 
    @Column(name = "EMP_ID") 
    private long id; 

    private String name; 

    @OneToMany(mappedBy = "employee") 
    @Cascade(value = { CascadeType.REMOVE, CascadeType.SAVE_UPDATE }) 
    private List<EmpDetails> details = new ArrayList<EmpDetails>(); 

} 

EmpDetails.java

@Entity 
public class EmpDetails { 
    @Id 
    private long id; 
    private int info; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "EMP_ID") 
    private Employee employee; 
} 

現在我在DATABSE與員工ID記錄爲10,對應的記錄在員工詳細信息表中。

現在,當我運行下面的查詢:

session.beginTransaction(); 

    session.delete(new Employee(10)); // here 10 is the ID of the employee 

    session.getTransaction().commit(); 
    session.close(); 

我想Hibernate會刪除員工記錄和相應的員工詳細記錄,因爲我已經設置了級聯式刪除。但我得到的例外是:

造成的: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 不能刪除或更新父行,外鍵約束失敗

可有人請幫助我如何在這裏測試級聯刪除選項?

回答

5

REMOVE級聯類型適用於標準JPA remove()操作。對於原生的Hibernate delete()操作,你需要使用一個Hibernate-proprietary annotation

@Cascade(CascadeType.DELETE) 
+0

JB嗨,我試圖刪除選項,但仍然得到同樣的錯誤。我在我的代碼中使用hibernate註釋進行級聯。我的日誌顯示它不是從EmpDetails表中刪除,而是從Employee表中刪除。 – user3181365

+2

另一個問題是你正在刪除'新員工(10)'。這個新員工因此在其列表中沒有詳細信息。使用'delete(session.get(Employee.class,10));' –

+0

謝謝JB,它現在解決了我的問題。 – user3181365

相關問題