2016-03-15 150 views
0

我有父母Filter實體和一個方向List<Ad>ads與子女@OneToMany的關係。我嘗試刪除廣告,其中更多的則是隻有一個星期的使用Hibernate hql查詢,但得到:MySQLIntegrityConstraintViolationException用於Hibernate hsql刪除。無法刪除或更新父行

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:不能刪除或更新父行,外鍵約束失敗( 。gecarsfilters_ads,約束FK_gcri6h0918u8o2ybd6yfquk79外鍵(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(); 
} 
+0

嘗試級聯都在那裏:@ OneToMany(cascade = CascadeType.ALL) –

+0

我試過了。不工作,得到相同的例外。 –

+0

你可以看看這裏http://stackoverflow.com/questions/32146911/hibernate-throws-cannot-delete-or-update-a-parent-row-a-foreign-key-constraint –

回答

0

問題的原因是,如果@OneToMany關聯側是關係的所有者,則使用連接表。

要指定湊ads表列(外鍵)用於關聯的,而不是一個單獨的連接表,簡單地映射了@JoinColumn的關聯:

@OneToMany 
@JoinColumn 
private Set<Ad> ads; 
0

它的發生是因爲Hibernate不會從關係中刪除實體Ads

所以你需要刪除自己Ad從關係刪除前。

或者您可以使用@OneToManymappedBy它不會創建額外的表filters_ads因爲它們之間的關係不會創建約束。

+0

所以,如果我決定使用@ManyToMany關係在我的情況下,那麼我應該先選擇所有過濾器然後對其進行foreach並檢查廣告插入時間,然後將其從Filter實體中的廣告列表中刪除? –

+0

就像這樣。但是,您可以只選擇那些有時間<:日期的廣告所需的過濾器。 – Gwaeron