2013-03-01 61 views
4

在我的項目我有用戶和公司實體:休眠雙向多對多刪除問題

@Entity 
@Table(name = "users") 
public class UserDetails { 

    @Id 
    @GeneratedValue 
    @Column(name = "user_id") 
    private int id; 

    @Column(name = "first_name") 
    @NotEmpty 
    @Size(min = 2, max = 20) 
    private String firstName; 

    @ManyToMany(cascade = CascadeType.REFRESH) 
    @JoinTable(name = "users_companies", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "company_id")) 
    private Set<CompanyDetails> userCompanies = new HashSet(); 

    //getters and setters of course... 
} 

@Entity 
@Table(name = "companies") 
public class CompanyDetails { 
    @Id 
    @GeneratedValue 
    @Column(name = "company_id") 
    private int id; 

    @Column(name = "name") 
    @NotEmpty 
    @Size(min = 1, max = 255) 
    private String name; 

    @ManyToMany(mappedBy = "userCompanies") 
    private Set<UserDetails> companyUsers = new HashSet(); 

} 

我針對分配用戶的公司,然後再試着刪除。當我刪除用戶一切正常 - 用戶刪除,記錄從「users_companies」表格中刪除也和公司保持(如需要)。但是,當我嘗試刪除公司時,我有以下根本原因堆棧跟蹤:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`d_torianik/users_companies`, CONSTRAINT `FK447D806437A764EB` FOREIGN KEY (`company_id`) REFERENCES `companies` (`company_id`)) 

您能幫我解決此問題嗎?謝謝。

回答

1

您必須在實體companyUsersCascade註釋中註冊CascadeType.REMOVE

[評論後編輯]

遺憾錯過一兩件事在我的答案是,它是一個多對多的。所以級聯刪除將不起作用。然後問題是負責關係的是UserDetails類。這就是爲什麼它在一個方面而不是另一個方面工作。刪除公司之前,你可能必須從設置companyUsers的每個的UserDetails設置userCompanies刪除此公司。

+0

它不僅從關係表和用戶表中刪除我的用戶:( – sidlejinks 2013-03-01 14:14:53

+0

對不起,我錯過了我的答案中的一件事是它是一個多對多的。所以級聯刪除將無法正常工作。那麼問題是,負責的關係是'UserDetails'類。這就是爲什麼它的工作原理上的一種方式,而不是在另一個。刪除公司之前,你可能必須從'userCompanies'集刪除此公司在'companyUsers'的每個UserDetails'集合中。 – benzonico 2013-03-01 15:03:33

+0

我不能再有任何解決方案嗎? – sidlejinks 2013-03-01 15:14:47

3

我知道這是舊的,但它可以幫助別人。我試圖做同樣的事情 - 從每個主表中刪除先刪除引用的記錄所加入的表,然後從主刪除記錄表。 benzonico的職位是有效的,但還有一個更簡單的方法來做到這一點(而不必從連接表中刪除自己的記錄)。公司桌面上的映射也需要更改爲主桌面(不要使用mappedBy):

@Entity 
@Table(name = "companies") 
public class CompanyDetails { 
    @Id 
    @GeneratedValue 
    @Column(name = "company_id") 
    private int id; 

    @Column(name = "name") 
    @NotEmpty 
    @Size(min = 1, max = 255) 
    private String name; 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinTable(name = "users_companies", 
    joinColumns = {@JoinColumn(name = "company_id")}, 
    inverseJoinColumns = @JoinColumn(name = "user_id")) 
    private Set<UserDetails> companyUsers = new HashSet(); 

} 

應該這樣做。現在只要您刪除公司,Hibernate會先刪除users_companies記錄,然後它會刪除該公司本身。更多的信息在這裏:http://www.codereye.com/2009/06/hibernate-bi-directional-many-to-many.html