Как JPA (Hibernate) справляется с транзакцией при извлечении объекта из базы данных - PullRequest
0 голосов
/ 29 октября 2008

В настоящее время я разрабатываю приложение в java, используя Hibernate в качестве диспетчера постоянства и JPA в качестве абстракции управления постоянством в спящем режиме.

Я хотел бы знать, как обернуть запрос результата вокруг транзакции. Я знаю, что менеджер сущностей должен оставаться открытым для лениво извлеченной полевой ошибки. Как насчет транзакций во всем этом?

Вот пример кода с возможностью активации / деактивации транзакции.

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

В чем разница между включением или отключением withTransaction при вызове этой функции?

Спасибо всем, Fred

1 Ответ

5 голосов
/ 29 октября 2008

Здесь нет практической разницы, поскольку вы не меняете никаких данных. Выполненный вами запрос сгенерирует выбор SQL. Транзакции позволяют применять свойства ACID к коллекции вставок, обновлений и т. Д.

Однако , если вы начнете манипулировать объектами в списке, возвращаемом этим методом, вызывать сеттеры и т. Д., Эти изменения будут распространены обратно в базу данных вне транзакции на специальной основе. , Другими словами, вы будете эффективно работать с БД в режиме автоматической фиксации. Это вряд ли то, что вы хотите.

Важно понимать, что длительностью контекста постоянства и транзакции можно управлять отдельно. Хотя часто вы хотели бы управлять ими вместе.

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