воскресенье, 11 июля 2010 г.

JPA, как удалить запись и связанные с ней записи.

У меня есть 2-е таблицы, в одной из них создаются элементы связанные с одним из элементов в другой таблице.
Простым методом удаления типа:

    public void deleteInvisibleNotice(Notice noticeName) {
        EntityManager iem = EntityManagerProvider.getEntityManager();
        try {
            iem.getTransaction().begin();
            Notice localNotice = iem.find(Notice.class, noticeName.getId());
            iem.remove(localNotice);
            iem.getTransaction().commit();
        } finally {
            iem.close();
        }
    }

Удалить связанные с этой записью записи в другой таблице, естественно не получится, а кроме того, ее просто нельзя удалить, ибо нарушится целостность БД или что-то в этом духе, в общем не даст БД ее удалить, выдав ошибку (раньше наверное гибернейт заругается, в общем не суть.)
Порывшись в интернете нашел способ, который и применил, скорее всего я его немного изменю, но суть от этого не изменится - он работает.

    public void deleteNoticeAndHisParameters(Integer noticeId) {
        EntityManager iem = EntityManagerProvider.getEntityManager();
        try {
            iem.getTransaction().begin();
            Notice localNotice = iem.find(Notice.class, noticeId);
            Query q = iem.createQuery("select Object(o) from ParameterValue as o where o.notice = :notice");
            q.setParameter("notice", localNotice);
            List parameterValuesList = q.getResultList();
            for (ParameterValue parameterValue : parameterValuesList) {
                parameterValue.getNotice().getParameterValues().remove(parameterValue);
                iem.remove(parameterValue);
            }
            localNotice = iem.merge(localNotice);
            iem.remove(localNotice);
            iem.getTransaction().commit();
        } finally {
            iem.close();
        }
    }

Комментариев нет:

Отправить комментарий