将Select语句放在Hibernate事务上
我已经阅读了一段时间关于Hibernate,但我似乎无法理解有关Transaction
一个概念。
在我访问过的某些网站上, Select
语句处于交易模式。
public List readAll() { Session session = HibernateUtil.getSessionFactory() .getCurrentSession(); session.beginTransaction(); List booksList = session.createQuery("from Book").list(); session.getTransaction().commit(); return booksList; }
在某些网站上,它并不主张在Select
语句中使用事务:
public List readAll() { Session session = HibernateUtil.getSessionFactory() .getCurrentSession(); List booksList = session.createQuery("from Book").list(); return booksList; }
我在想我应该遵循哪一个。 Select
陈述是否需要交易?
这取决于用例。
在典型的CRUD样式Web应用程序中,常见的实体配置是使用版本控制和乐观锁定。 (hibernate注释文档)如果应用程序使用乐观锁定,脏读取可能不那么重要,并且不需要将select放入事务中。
当脏读不可接受时,则选择的事务是合适的。 大多数情况下,在这种情况下,选择将与某些数据修改一起完成,这需要在某个时间点完全一致。
session.getTransaction().commit()
用于将更改保存到数据库,如果您在数据库中更改了插入或更新,则使用它
您可以选择在此处使用交易,因为您可以获得相同的结果。
除非您要对数据进行一些更改,否则您不需要事务。 有些人希望在与DB交互时总是有事务,但这只是一个约定。 在这种情况下,您可以使用session.setFlushMode(FlushMode.NEVER);
来使用只读事务session.setFlushMode(FlushMode.NEVER);
你也最好使用
session.createCriteria(Book.class).LIST();
因为任何重构都会自动更改查询。
据我所知,hibernate需要一个事务处理。 尝试在没有事务的情况下运行它,看看它是否失败。
我最近一直使用spring和JPA,如果我忘记打开一个事务(通过注释),就会启动一个只读事务。 但这可能是春季特定的。
- 集合中元素的hibernate标准
- 读/写分裂hibernate
- 使用Hibernate将Oracle Date映射到Java对象
- 使用JPA(Hibernate)查找包含给定记录的页面
- 在温和使用后,Tomcat会随着AbstractProtocol暂停而随机关闭
- 将Hibernate实体映射为未知的DiscriminatorValue for InheritanceType.SINGLE_TABLE
- 在Hibernate中持久化Joda DateTime而不是Java Date
- Hibernate PersistentSet remove()操作不起作用
- Hibernate通用DAO,通用服务和通用视图层?