![](/img/trans.png)
[英]Can't get hibernate to delete children instances via cascade, that were removed from a one-to-many relation
[英]Hibernate: One To Many Relation on cascade save but doesn't delete
我對Hibernate有問題。
簡而言之:
當關系具有屬性並且我們需要級聯保存,刪除和更新時,如何與Hibernate配置ManyToMany關聯?
很大:
想象以下數據庫:
Super Mini
M______N
|
attribute
這里有3個表格:
"Mini", "Super" and "Super_Mini".
現在,假設Super_Mini具有1個關系屬性(顯然還有鍵)。
好的,現在這可以通過以下方式轉換為Hibernate:
Super:
// The relation is Many to Many, but considering that it has an attribute, this is OneToMany with the ManyMany RelationShip
@OneToMany(mappedBy="mini", targetEntity=Mini.class)
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
@LazyCollection(LazyCollectionOption.TRUE)
private Set<SuperMini> superMini = new HashSet<SuperMini>();
SuperMini:
@Id
@ManyToOne(targetEntity=Super.class,fetch=FetchType.LAZY)
@Cascade({CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })
private Super super;
@Id
@ManyToOne(targetEntity=Mini.class,fetch=FetchType.LAZY)
@Cascade({CascadeType.LOCK})
@JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })
private Mini mini;
因此,我認為配置是正確的,並且保存(獨立)(如果對象具有Mini子項)則將所有這些保存。 問題是當我嘗試刪除對象時:
Super data = getHibernateTemplate().load(Super.class, idSuper);
getHibernateTemplate().getSessionFactory().getCurrentSession().clear();
data.setMini( new HashSet<Mini>() );
getHibernateTemplate().delete( data );
getHibernateTemplate().getSessionFactory().getCurrentSession().flush();
Hibernate不會刪除Mini關系……這是什么問題? 我知道如何通過HQL解決該問題,但是我可能不知道配置是否正確。
先感謝您,
您的問題不清楚。 Super
不包含Set<Mini2>
。 它包含一個Set<SuperMini2>
。 因此,最后一個代碼片段沒有多大意義。
此外, Super.superMini2
上的targetEntity
屬性不正確,並且是不必要的。
CascadeType.ALL
包括CascadeType.DELETE
,因此它也是不必要的。
但是要回答您的問題,我認為問題在於將Super
級聯刪除到SuperMini2
因為關聯具有級聯刪除,但是在SuperMini2和Mini2之間沒有級聯刪除,因此,當然不會刪除Mini2實例。
編輯:
答案是,OP在編輯問題之前,先刪除SuperMini集合中的所有實體,然后再刪除Super實體。 因此,Supermini集合上的級聯刪除不再有任何要刪除的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.