ManyToMany删除问题

时间:2010-09-07 15:58:47

标签: java hibernate

我有一张表: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>();

和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>();

如您所见,ManyToMany的桥接表是:document_type_property_type。

我不明白为什么如果我从doc类型中删除属性类型,它不仅从桥表中删除(如我想要/期望),而且从属性类型中删除它本身(我想避免!)。

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

感谢。

修改:用于删除媒体资源类型的代码 - doc type relation:

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");  
 }

1 个答案:

答案 0 :(得分:2)

我注意到在关系的两边都有级联类型设置为DELETE_ORPHAN。我想你可能不得不将它设置在一边或没有。我不确定DELETE_ORPHAN在您的方案中是否相关。

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