我有3个Java
Hibernate
实体。User
具有与Filter
实体的单向oneToMany
表示。Filter
实体与Model
实体具有单向manyToOne
关系。我只想删除Filter
实体,但获取MySQLIntegrityConstraintViolationException
。
无法删除或更新父行:外键约束失败(
gecars
.users_filters
、约束FK_oymjo03tkarckpfjfmaak99lj
外键(filters_id
)引用filters
(id
))
用户:
@Entity
@Table(name="users")
public class User {
...
//@OneToMany(fetch = FetchType.LAZY) // old
@OneToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL) //edited but exception still occurs
private Set<Filter> filters = new HashSet<Filter>(0);
过滤器:
@Entity
@Table(name="filters")
public class Filter {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_model")
private Model model;
...
DAO类中的删除方法:
public void deleteFilter(int filterId){
String hql = "delete from Filter where id= :filterId";
session.createQuery(hql).setInteger("filterId", filterId).executeUpdate();
}
或session.delete
public void deleteFilter(int filterId){
try {
session.beginTransaction();
session.delete(getFilter(filterId));
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
发布于 2016-02-10 05:36:12
您正在为一对多的关联使用联接表。我假设您已经从映射自动生成了模式,因此您可能不知道这一点。这样,当您通过大容量Hibernate DML语句删除Filter
时,联接表中的记录将保持不变,并导致外键约束冲突。
最好的方法是在多个方面定义一个联接列:
@Entity
@Table(name="filters")
public class Filter {
@ManyToOne
@JoinColumn(name = "user")
private User user;
}
@Entity
@Table(name="users")
public class User {
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.All, mappedBy="user")
private Set<Filter> filters = new HashSet<Filter>(0);
}
如果不想使用双向关联,可以在User
实体中定义联接列:
@Entity
@Table(name="users")
public class User {
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.All)
@JoinColumn(name = "user")
private Set<Filter> filters = new HashSet<Filter>(0);
}
这样,联接列仍然在filters
表中,因此删除Filter
不会导致外键冲突。
https://stackoverflow.com/questions/35315524
复制