Как JPA (Hibernate) справляется с транзакцией при извлечении объекта из базы данных

StackOverflow https://stackoverflow.com/questions/245723

Вопрос

В настоящее время я разрабатываю приложение в 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 при вызове этой функции?

Спасибо всем, Фред

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top