Hibernate:一对多关系级联保存但不删除

时间:2011-12-16 09:58:12

标签: java hibernate annotations cascade cascading-deletes

我遇到了Hibernate的问题。

简而言之:

当关系具有属性并且我们需要级联保存,删除和更新时,如何使用Hibernate配置ManyToMany关联?

In Large:

想象一下以下数据库:

             Super      Mini
                 M______N
                     |
                     attribute

这里有3个表:

"Mini", "Super" and "Super_Mini".

现在想象一下Super_Mini有一个关系属性(显然是关键字)。

好的,现在通过以下方式转换为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;

所以,我认为配置是正确的,并且保存,如果对象有迷你儿童独立保存所有这些。问题是当我尝试删除对象时:

 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解决它,但可能配置不正确,我不知道。

提前谢谢你,

1 个答案:

答案 0 :(得分:1)

你的问题不明确。 Super不包含Set<Mini2>。它包含Set<SuperMini2>。所以最后的代码片段没有多大意义。

此外,targetEntity上的Super.superMini2属性不正确,且不必要。

CascadeType.ALL包括CascadeType.DELETE,所以也没必要。

但是要回答你的问题,我认为问题是删除Super级联到SuperMini2,因为关联有级联删除,但SuperMini2和Mini2之间没有级联删除,所以当然,Mini2实例不会被删除。

编辑:

答案是OP在编辑问题之前,在删除Super实体之前从SuperMini集合中删除了所有实体。所以Supermini集合上的级联删除没有任何东西可以删除了。