我遇到了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解决它,但可能配置不正确,我不知道。
提前谢谢你,
答案 0 :(得分:1)
你的问题不明确。 Super
不包含Set<Mini2>
。它包含Set<SuperMini2>
。所以最后的代码片段没有多大意义。
此外,targetEntity
上的Super.superMini2
属性不正确,且不必要。
CascadeType.ALL
包括CascadeType.DELETE
,所以也没必要。
但是要回答你的问题,我认为问题是删除Super
级联到SuperMini2
,因为关联有级联删除,但SuperMini2和Mini2之间没有级联删除,所以当然,Mini2实例不会被删除。
编辑:
答案是OP在编辑问题之前,在删除Super实体之前从SuperMini集合中删除了所有实体。所以Supermini集合上的级联删除没有任何东西可以删除了。