Hibernate双向ManyToMany删除问题

sid*_*nks 4 many-to-many hibernate hibernate-mapping

在我的项目中,我为用户和公司提供实体:

@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();

}
Run Code Online (Sandbox Code Playgroud)

我将用户分配给公司,然后尝试删除。当我删除用户时,一切正常-用户已删除,'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`))
Run Code Online (Sandbox Code Playgroud)

您能帮我解决这个问题吗?谢谢。

Kos*_*era 5

我知道这很旧,但可能会对某人有所帮助...我试图做完全相同的事情-从每个主表中删除,以先在联接表中删除引用的记录,然后再从主表中删除该记录。benzonico的帖子是有效的,但是有一种更简单的方法(不必自己从联接表中删除记录)。公司表上的映射也需要更改为主表(不要使用mapledBy):

@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();

}
Run Code Online (Sandbox Code Playgroud)

这应该够了吧。现在,无论何时删除公司,Hibernate都会先删除users_companies中的记录,然后再删除公司本身。此处提供更多信息:http : //www.codereye.com/2009/06/hibernate-bi-direction-many-to-many.html


ben*_*ico 1

您必须CascadeType.REMOVE在实体Cascade属性的注释中包含一个。companyUsersCompanyDetails

[评论后编辑]

抱歉,我在回答中错过了一件事,那就是它是多对多的。所以级联删除不起作用。那么问题就在于负责关系的是UserDetails类。这就是为什么它以一种方式起作用,而以另一种方式不起作用。在删除公司之前,您可能必须从 companyUsers 集中的每个 UserDetails 中的 userCompanies 集中删除该公司。