簡體   English   中英

休眠:級聯保存但不刪除一對多關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM