为什么我们在hibernate中打开会话以从数据库中获取数据而不持久化,在JPA中我们使用EntityManager来加载数据,但是我们不打开事务来从数据库中获取数据。
答案 0 :(得分:0)
好问题。在本机Hibernate中,一个会话与JPA中的EntityManager具有相同的功能,那么为什么大多数hibernate示例在读取数据时都有一个事务。
如果您刚刚打开一个会话,并且只进行了读取查询,那么您应该没问题。但这不是recommended。问题是,如果您使用现有会话,您的选择查询可能会导致预查询 - 刷新,最终可能会插入。 您可能还想查看此post
就我个人而言,我几乎从未在EntityManager或Session上显式调用getTransaction()。使用容器管理器EntityManager / Session和声明式事务(如Spring @Transactional或J2EEs @TransactionAttribute)要好得多。您可以通过查看此tutorial来了解其工作原理。该示例有点过时,因为您将使用spring-data JPARepositories而不是编写自己的DAO。