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...
Пока на собственное сообщение не было ответов, его можно удалить.