Hibernate не удаляет мои объекты.Зачем? - PullRequest
1 голос
/ 08 марта 2011

Я только что настроил тест, который проверяет, что я могу вставлять записи в свою базу данных с помощью Hibernate. Меня сводит с ума то, что Hibernate фактически не удаляет записи, хотя сообщает, что они пропали!

Тест, приведенный ниже, проходит успешно, но когда я проверяю свою БД, записи, которые были вставлены, все еще там! Я даже пытаюсь проверить это, используя assert (да, у меня есть -ea в качестве параметра vm). У кого-нибудь есть подсказка, почему записи не удаляются?

public class HibernateExportStatisticDaoIntegrationTest {
    HibernateExportStatisticDao dao;
    Transaction transaction;

    @Before
    public void setUp(){
        assert numberOfStatisticRowsInDB() == 0;
        dao = new HibernateExportStatisticDao(HibernateUtil.getSessionFactory());
    }

    @After
    public void deleteAllEntries(){
        assert numberOfStatisticRowsInDB() != 0;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        for(PersistableStatisticItem item:allStatisticItemsInDB()) {
            session.delete(item);
        }
        session.flush();
        assert numberOfStatisticRowsInDB() == 0;
    }

    @Test public void exportAllSavesEntriesToDatabase(){
        int expectedNumberOfStatistics = 20;
        dao.exportAll(StatisticItemFactory.createTestStatistics(expectedNumberOfStatistics));

        assertEquals(expectedNumberOfStatistics, numberOfStatisticRowsInDB());
    }

    private int numberOfStatisticRowsInDB() {
        return allStatisticItemsInDB().size();
    }

    @SuppressWarnings("unchecked")
    private List<PersistableStatisticItem> allStatisticItemsInDB(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        transaction = session.beginTransaction();
        Query q = session.createQuery("FROM PersistableStatisticItem item");
        return q.list();
    }
}

Консоль заполнена

Hibernate: delete from UPTIME_STATISTICS where logDate=? and serviceId=?

но при проверке ничего не было удалено.

Ответы [ 3 ]

5 голосов
/ 08 марта 2011

Я думаю, это связано с непоследовательным использованием транзакций (обратите внимание, что beginTransaction() в allStatisticItemsInDB() вызывается несколько раз без соответствующих фиксаций).

Попробуйте правильно управлять транзакциями, например, вот так:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
for(PersistableStatisticItem item:
    session.createQuery("FROM PersistableStatisticItem item").list()) {
    session.delete(item);
}
session.flush();
assert session.createQuery("FROM PersistableStatisticItem item").list().size() == 0;
tx.commit();

См. Также:

1 голос
/ 10 октября 2016

У меня такая же проблема.Хотя я не использовал транзакцию вообще.Я использовал namedQuery следующим образом:

Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
session.close();

Возвращалось 2 строки, но в базе данных все еще были все записи.Затем я завершаю приведенный выше код следующим образом:

Transaction transaction = session.beginTransaction();
Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
transaction.commit();
session.close();

Затем он начал работать нормально.Я использовал SQL-сервер.Но я думаю, что если мы используем h2, приведенный выше код (без транзакций) также будет работать нормально.Еще одно замечание: для вставки и получения записей использование транзакции не обязательно, но для удаления записей нам придется использовать транзакцию.(проверено только на сервере SQL)

0 голосов
/ 08 марта 2011

Можете ли вы опубликовать свою схему БД и карты HBM или Fluent?Одна вещь, которая вернула меня некоторое время назад, заключалась в том, что я имел ReadOnly () на моей карте Fluent.Он никогда не выдавал ошибку, и я тоже видел "удалить из бла, где бла-бла = ..." в журналах.

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