Hibernate: отношение один ко многим при каскадном сохранении, но не удаляет - PullRequest
1 голос
/ 16 декабря 2011

У меня проблема с Hibernate.

Короче говоря:

Как настроить связь ManyToMany с Hibernate, когда связь имеет атрибут, и нам нужно сохранить, удалить и обновитьв каскаде?

В целом:

Представьте себе следующую базу данных:

             Super      Mini
                 M______N
                     |
                     attribute

Здесь есть 3 таблицы:

"Mini", "Super" and "Super_Mini".

Теперь представьте, что Super_Mini имеет 1 атрибут для отношения (и, очевидно, ключи).

Хорошо, теперь это переводится в Hibernate следующим образом:

 Super:
 // The relation is Many to Many, but considering that it has an attribute, this is OneToMany with the ManyMany RelationShip
 @OneToMany(mappedBy="mini", targetEntity=Mini.class)   
 @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})    
 @LazyCollection(LazyCollectionOption.TRUE)
 private Set<SuperMini> superMini = new HashSet<SuperMini>();


 SuperMini:
 @Id    
 @ManyToOne(targetEntity=Super.class,fetch=FetchType.LAZY)  
 @Cascade({CascadeType.LOCK})   
 @JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })  
 private Super super;   

 @Id    
 @ManyToOne(targetEntity=Mini.class,fetch=FetchType.LAZY)   
 @Cascade({CascadeType.LOCK})   
 @JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") })  
 private Mini mini;

Итак, я думаю, что конфигурацияисправить и сохранить независимо, если у объекта есть мини-дети, сохраните их все.Проблема в том, что я пытаюсь удалить объект:

 Super data = getHibernateTemplate().load(Super.class, idSuper);

 getHibernateTemplate().getSessionFactory().getCurrentSession().clear();

 data.setMini( new HashSet<Mini>() );

 getHibernateTemplate().delete( data );
 getHibernateTemplate().getSessionFactory().getCurrentSession().flush();

Hibernate не удаляет отношение Mini ... В чем проблема?Я знаю, как решить эту проблему с помощью HQL, но, возможно, конфигурация неверна, я не знаю.

Заранее спасибо,

1 Ответ

1 голос
/ 16 декабря 2011

Ваш вопрос не ясен. Super не содержит Set<Mini2>. Содержит Set<SuperMini2>. Так что последний фрагмент кода не имеет особого смысла.

Кроме того, атрибут targetEntity в Super.superMini2 является неправильным и ненужным.

CascadeType.ALL включает CascadeType.DELETE, так что это также не нужно.

Но чтобы ответить на ваш вопрос, я думаю, что проблема заключается в том, что удаление Super каскадов до SuperMini2, потому что у ассоциации есть каскадное удаление, но между SuperMini2 и Mini2 нет каскадного удаления, поэтому, конечно, экземпляры Mini2 не удалено.

EDIT:

Ответ заключается в том, что OP перед редактированием вопроса удалил все сущности из коллекции SuperMini перед удалением сущности Super. Поэтому каскадному удалению коллекции Supermini больше нечего было удалять.

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