Есть класс — категория.
В ней может быть несколько подкатегорий:
@Entity
@Table(name = "news_category")
public class Category {
private int id;
private String name;
private Category parent;
private Collection<Category> childs;
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = {CascadeType.REMOVE})
public Collection<Category> getChilds() {
return childs;
}
public void setChilds(Collection<Category> childs) {
this.childs = childs;
}
@ManyToOne
@JoinColumn(name = "parent_id")
public Category getParent() {
return parent;
}
public void setParent(Category parent) {
this.parent = parent;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Хочу чтобы при удалении категории все ее подкатегории тоже удалялись.
Но когда вызываю в DAO
sessionFactory.getCurrentSession().delete(category);
sessionFactory.getCurrentSession().flush();
удаляется только сама категория, а не подкатегории.
Почему CascadeType.REMOVE не помогает? Что я не так делаю?
Здравствуйте, LDimas, Вы писали:
LD>Хочу чтобы при удалении категории все ее подкатегории тоже удалялись.
LD>Но когда вызываю в DAO
LD>LD> sessionFactory.getCurrentSession().delete(category);
LD> sessionFactory.getCurrentSession().flush();
LD>
LD>удаляется только сама категория, а не подкатегории.
LD>Почему CascadeType.REMOVE не помогает? Что я не так делаю?
Я набросал тест, с Вашим маппингом на самом деле все работает, дочерние категории удаляются. Может Вы не совсем правильно создаете объекты, и забываете добавить,
например, child.setParent(parent), когда добавляете child в список у Parent?
package test;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.AnnotationConfiguration;
public class TestCategory extends TestCase {
public void testRemove() {
SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Category parent = new Category();
Category child = new Category();
parent.getChilds().add(child);
child.setParent(parent);
session.saveOrUpdate(child);
session.saveOrUpdate(parent);
session.flush();
tx.commit();
session.clear();
assertEquals(2L, getCategoriesCount(session));
tx.begin();
session.delete(parent);
session.flush();
tx.commit();
session.clear();
assertEquals(0L, getCategoriesCount(session));
}
private long getCategoriesCount(Session session) {
return (Long) session.createQuery("select count(*) from test.Category").uniqueResult();
}
}