将Select语句放在Hibernate事务上

时间:2011-01-03 06:47:32

标签: java hibernate orm

我一直在阅读关于Hibernate的一段时间,但我似乎无法理解有关Transaction的一个概念。

在我访问的某些网站上,Select语句处于交易模式中。

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 个答案:

答案 0 :(得分:8)

这取决于用例。

在典型的CRUD样式的Web应用程序中,常见的实体配置是使用版本控制和乐观锁定。 (hibernate annotation docs)如果应用程序使用乐观锁定,脏读取可能不那么重要,并且不需要将select放入事务中。

如果不接受脏读,则选择的事务是合适的。大多数情况下,在这种情况下,选择将与一些需要完全一致的数据修改一起完成。

答案 1 :(得分:3)

session.getTransaction().commit()用于保存对数据库的更改,如果您在数据库中更改了插入或更新,则使用它

答案 2 :(得分:1)

据我所知,hibernate需要一个事务处理。尝试在没有事务的情况下运行它,看看它是否失败。

我最近一直在使用spring和JPA,如果我忘记打开一个事务(通过注释),就会启动只读事务。但这可能是春季特定的。

答案 3 :(得分:1)

您可以选择在此处使用交易,因为您可以获得相同的结果。

除非您要对数据进行一些更改,否则您不需要进行交易。有些人希望在与DB交互时总是有事务,但这只是一个约定。在这种情况下,您可以使用session.setFlushMode(FlushMode.NEVER);

使用只读事务

你最好还是使用

  

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

     

任何重构都会自动更改查询。