我有父Filter
个实体和一个方向List<Ad>ads
作为@OneToMany
关系的孩子。我尝试使用Hibernate hql
查询删除超过一周的广告,但获取:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(
gecars
。filters_ads
,CONSTRAINTFK_gcri6h0918u8o2ybd6yfquk79
FOREIGN KEY(ads_id
)参考ads
(id
))
用户:
@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();
}
答案 0 :(得分:0)
这是因为Hibernate不会从关系中删除实体Ads
。
因此,您需要在删除之前从关系中删除自己Ad
。
或者您可以使用@OneToMany
到mappedBy
它不会创建额外的表filters_ads
,因为它不会产生约束。
答案 1 :(得分:0)
问题的原因是如果pollQueueForResult
关联方是关系的所有者,则使用连接表。
要指定@OneToMany
表中的连接列(外键)用于关联而不是单独的连接表,只需将关联映射到ads
:
@JoinColumn