tags:

views:

42

answers:

1

Hi guys,

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().persist(propertyType);
  FacesMessages.instance().add(StatusMessage.Severity.INFO, "Property Type was succesfully removed from this document type");  
 }
+2  A: 

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.

Vincent Ramdhanie
Of course, DELETE_ORPHAN caused problems....thanks!
Cristian Boariu