多对多删除问题

问题描述:

我有一个表:DocumentType:多对多删除问题

@ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY) 
@JoinTable(
    name = "document_type_property_type", 
    joinColumns = @JoinColumn(name = "document_type"), 
    inverseJoinColumns = @JoinColumn(name = "property_type") 
) 
@Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
@ForeignKey(name = "FK_DOCUMENT_TYPE_PROPERTY_TYPE__DOCUMENT_TYPE", inverseName = "FK_DOCUMENT_TYPE_PROPERTY_TYPE__PROPERTY_TYPE") 
@Sort(type = SortType.NATURAL) 
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>(); 

和属性类型:

@ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY) 
@JoinTable(
    name = "document_type_property_type", 
    joinColumns = @JoinColumn(name = "property_type"), 
    inverseJoinColumns = @JoinColumn(name = "document_type") 
) 
@Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
@Sort(type = SortType.NATURAL) 
protected SortedSet<DocumentType> documentTypes = new TreeSet<DocumentType>(); 

正如你看到的多对多表桥是:document_type_property_type。

我不明白为什么,如果我从它不仅删除它从网桥表一份文件类型删除属性类型(我希望/预期),而且还物业类型本身删除它(我想避免!)。

你能给我一个解决方法吗?

谢谢。

编辑:删除属性类型码 - 文档类型关系:

public void removePropertyType(final PropertyType propertyType) { 
    super.performDAudit(propertyType); 
    final DocumentType currentInstance = getInstance(); 
    currentInstance.getPropertyTypes().remove(propertyType); 
    getEntityManager().persist(propertyType); 
    FacesMessages.instance().add(StatusMessage.Severity.INFO, "Property Type was succesfully removed from this document type"); 
} 

我注意到你有级联类型设置为DELETE_ORPHAN在关系的两侧。我想你可能要么将它放在一边,要么不放。我不确定DELETE_ORPHAN在你的场景中是否相关。

据我所知,只有一方的关系实际上“拥有”了关系。这是应该管理所有级联的一面,反面应该什么也不做。

+0

当然,DELETE_ORPHAN引起了问题....谢谢! – 2010-09-07 16:20:53