Помещение оператора Select в транзакцию Hibernate - PullRequest
5 голосов
/ 03 января 2011

Я некоторое время читал о Hibernate, но я не могу понять одну концепцию относительно Transaction.

На некоторых сайтах, которые я посещаю, операторы Select находятся в режиме транзакции, напримерthis.

public List<Book> readAll() {
    Session session = HibernateUtil.getSessionFactory()
            .getCurrentSession();
    session.beginTransaction();
    List<Book> booksList = session.createQuery("from Book").list();
    session.getTransaction().commit();
    return booksList;
}

Находясь на каком-либо сайте, он не защищает использование транзакции для Select заявлений:

public List<Book> readAll() {
    Session session = HibernateUtil.getSessionFactory()
            .getCurrentSession();
    List<Book> booksList = session.createQuery("from Book").list();
    return booksList;
}

Я думаю, какой из них следует следовать.Нужны ли транзакции по Select заявлениям или нет?

Ответы [ 4 ]

8 голосов
/ 03 января 2011

Зависит от варианта использования.

В типичном веб-приложении в стиле CRUD обычной конфигурацией сущностей является использование контроля версий и оптимистической блокировки. (документы аннотаций гибернации) Если приложение использует оптимистическую блокировку, грязное чтение, вероятно, не так важно, и нет необходимости помещать выбор в транзакцию.

Если грязное чтение неприемлемо, тогда подходит транзакция для выбора. В большинстве случаев при таком сценарии выбор будет выполняться в сочетании с некоторой модификацией данных, которая требует полной согласованности на определенный момент времени.

3 голосов
/ 03 января 2011

session.getTransaction().commit() используется для сохранения ваших изменений в базе данных, используйте его, если вы изменили в базе данных, например, вставка или обновление

1 голос
/ 05 января 2011

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

Если вы не собираетесь вносить какие-либо изменения в данные, вам не требуется транзакция. некоторые хотели бы иметь транзакцию всегда, когда они взаимодействуют с БД, но это просто соглашение. В этом случае вы можете использовать транзакцию только для чтения, используя session.setFlushMode(FlushMode.NEVER);

Также вам лучше использовать

session.createCriteria (Book.class) .list ();

Поскольку любой рефакторинг изменит запрос автоматически.

1 голос
/ 03 января 2011

Насколько я помню, hibernate требует транзакции для всего.Попробуйте запустить его без транзакции и посмотрите, не сработает ли это.

В последнее время я использовал его с пружиной и JPA, и если я забуду открыть транзакцию (с помощью аннотации), транзакция только для чтения будетначалось.Но это может быть связано с весной.

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