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)
您能帮我解决这个问题吗?谢谢。
我知道这很旧,但可能会对某人有所帮助...我试图做完全相同的事情-从每个主表中删除,以先在联接表中删除引用的记录,然后再从主表中删除该记录。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
您必须CascadeType.REMOVE
在实体Cascade
属性的注释中包含一个。companyUsers
CompanyDetails
[评论后编辑]
抱歉,我在回答中错过了一件事,那就是它是多对多的。所以级联删除不起作用。那么问题就在于负责关系的是UserDetails类。这就是为什么它以一种方式起作用,而以另一种方式不起作用。在删除公司之前,您可能必须从 companyUsers 集中的每个 UserDetails 中的 userCompanies 集中删除该公司。
归档时间: |
|
查看次数: |
7570 次 |
最近记录: |