用于Hibernate hsql删除的MySQLIntegrityConstraintViolationException。无法删除或更新父行

时间:2016-03-15 05:35:20

标签: java mysql hibernate

我有父Filter个实体和一个方向List<Ad>ads作为@OneToMany关系的孩子。我尝试使用Hibernate hql查询删除超过一周的广告,但获取:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(gecarsfilters_ads,CONSTRAINT FK_gcri6h0918u8o2ybd6yfquk79 FOREIGN KEY( ads_id)参考adsid))

用户:

@Entity
@Table(name="users")
public class User {
 ...
 @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user") 
 @OrderBy("id")
 private Set<Filter> filters = new HashSet<Filter>(0);
 ...

过滤器:

@Entity
@Table(name="filters")
public class Filter {
  ...
  // I also tried use @OneToMany(CascadeType.REMOVE, orphanremoval=true)
  // or @OneToMany(cascade=CascadeType.ALL,orphanRemoval=true)
  @OneToMany 
  private Set<Ad> ads; 
  ...

广告:

@Entity
@Table(name="ads")
public class Ad {
 ...
 private Date insertTime = new Date();
 ...

DAO删除方法:

public void deleteOldAds(Date date){
    String hql = "delete from Ad where insertTime < :date";
    session.createQuery(hql).setParameter("date",  date).executeUpdate();
}

2 个答案:

答案 0 :(得分:0)

这是因为Hibernate不会从关系中删除实体Ads

因此,您需要在删除之前从关系中删除自己Ad

或者您可以使用@OneToManymappedBy它不会创建额外的表filters_ads,因为它不会产生约束。

答案 1 :(得分:0)

问题的原因是如果pollQueueForResult关联方是关系的所有者,则使用连接表。

要指定@OneToMany表中的连接列(外键)用于关联而不是单独的连接表,只需将关联映射到ads

@JoinColumn