5

在我的项目中,我有用户和公司的实体:

@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`))

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

4

2 回答 2

6

我知道这很旧,但它可能对某人有所帮助......我试图做同样的事情 - 从每个主表中删除以首先在连接表中删除引用的记录,然后从主表中删除记录。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

于 2014-03-25T20:47:29.967 回答
1

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

[评论后编辑]

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

于 2013-03-01T12:50:12.527 回答