【问题标题】:Hibernate Bidirectional ManyToMany delete issue休眠双向多对多删除问题
【发布时间】:2013-02-15 19:51:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: hibernate many-to-many hibernate-mapping


    【解决方案1】:

    我知道这很旧,但它可能对某人有所帮助...我试图做完全相同的事情 - 从每个主表中删除以首先在连接表中删除引用的记录,然后从主表中删除记录. benzonico 的帖子是有效的,但有一种更简单的方法可以做到这一点(不必自己从连接表中删除记录)。 company 表的映射也需要更改为主表(不要使用 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

    【讨论】:

      【解决方案2】:

      您必须在实体CompanyDetails 的属性companyUsersCascade 注释中有一个CascadeType.REMOVE

      [在 cmets 之后编辑]

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

      【讨论】:

      • 它不仅将我的用户从关系表和用户表中删除:(
      • 对不起,我在回答中错过了一件事,那就是它是多对多的。所以级联删除不起作用。那么问题是负责关系的是UserDetails类。这就是为什么它以一种方式工作而不是以另一种方式工作的原因。在删除公司之前,您可能必须从companyUsers 集合中的每个UserDetails 中的userCompanies 集合中删除该公司。
      • 我再也找不到任何解决方案了?
      • 我的意思是不太复杂的解决方案。但无论如何,谢谢你的解决方案!:)
      猜你喜欢
      • 2015-05-31
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多