开发者

ManyToMany remove problem

开发者 https://www.devze.com 2023-01-15 17:44 出处:网络
I have a table: DocumentType: @ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)

I have a table: 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>();

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

As you see the bridge table for ManyToMany is: document_type_property_type.

I do not understand why if i remove a property type from a doc type it not only deletes it from bridge table (as i want/expect) but also deletes it from property type itself (which i want to avoid!).

Can you give me a work-around?

Thanks.

Edit: code for deleting a property type - doc type relation:

public void removePropertyType(final PropertyType propertyType) {
  super.performDAudit(propertyType);
  final DocumentType currentInstance = getInstance();
  currentInstance.getPropertyTypes().remove(propertyType);
  getEntityManager().persi开发者_运维百科st(propertyType);
  FacesMessages.instance().add(StatusMessage.Severity.INFO, "Property Type was succesfully removed from this document type");  
 }


I notice that you have the cascade type set to DELETE_ORPHAN on both sides of the relationship. I think you may either have to set it on one side or none. I am not sure that DELETE_ORPHAN is relevant in your scenario.

As I understand it, only one side of the relationship actually "owns" the relationship. That is the side that should manage all cascades and so on and the inverse side should do nothing.

0

精彩评论

暂无评论...
验证码 换一张
取 消