Hibernate CascadeType.REMOVE
От: LDimas Россия  
Дата: 26.01.07 06:15
Оценка:
Есть класс — категория.
В ней может быть несколько подкатегорий:
@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 не помогает? Что я не так делаю?
Re: Hibernate CascadeType.REMOVE
От: ikm  
Дата: 27.01.07 02:07
Оценка:
Здравствуйте, 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();
    }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.