ManyToMany удалить проблему - PullRequest
1 голос
/ 07 сентября 2010

У меня есть таблица: 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.

Я не понимаю, почему, если я удаляю тип свойства из типа документа, он не только удаляет его из таблицы моста (как я хочу / ожидаю), но также удаляет его из самого типа свойства (которого я хочу избежать!).

Можете ли вы дать мне обходной путь?

Спасибо.

Редактировать : код для удаления типа свойства - отношение типа документа:

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 Ответ

2 голосов
/ 07 сентября 2010

Я заметил, что у вас есть каскадный тип, установленный на DELETE_ORPHAN по обе стороны отношения.Я думаю, что вам, возможно, придется либо установить его на одну сторону, либо ни на одну.Я не уверен, что DELETE_ORPHAN имеет отношение к вашему сценарию.

Насколько я понимаю, только одна сторона отношений фактически "владеет" отношениями.Это сторона, которая должна управлять всеми каскадами и так далее, а обратная сторона ничего не должна делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...