注意到如果我想读取一些数据并且如果我没有事务上下文我将无法这样做因为
org.hibernate.HibernateException: No Session found for current thread
对于读取数据,通常不需要事务。
因此,为了让 Spring 管理 session ,即使对于只读操作(如选择...),它也需要有一个事务?
这不是开销吗?
PS.我不想手动打开和关闭 session ...
非常感谢。
最佳答案
@Transactional
除了指示 spring 启动和提交事务外,还告诉 spring 打开和关闭 session 。这不是很简单,但这就是它的工作原理。因此,如果您没有 @Transactional
,则不会打开任何 session 。以下是您的选择:
- 使用
@Transactional(readOnly=true)
- 目的是进行只读事务。我推荐那个 - 使用注入(inject)了
@PersistenceContext
的 JPAEntityManager
。它将为每次调用打开一个新的底层 session 。不是那么好的选择。但是您应该考虑将EntityManager
与 readOnly=true 事务一起使用 - 使用额外的方面/拦截器/过滤器来打开和关闭 session 。这很难,而且您最终可能会对 hibernate 当前 session 概念的 spring 实现感到困惑。
关于java - 通过 Spring + Hibernate 只读数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692431/