通过Spring + Hibernate只读数据

时间:2012-03-13 21:26:24

标签: java spring hibernate transactions

注意到如果我想读取一些数据,如果我没有事务上下文,我将无法这样做,因为

  

org.hibernate.HibernateException:找不到当前线程的会话

对于读取数据,通常不需要交易。

因此,为了让Spring管理会话,即使对于只读操作,它也需要进行交易......?

这不是开销吗?

PS。我不想手动打开和关闭会话......

非常感谢。

1 个答案:

答案 0 :(得分:4)

除了指示它启动并提交事务之外,

@Transactional告诉spring打开和关闭一个会话。这不是很简单,但它是如何工作的。因此,如果您没有@Transactional,则不会打开任何会话。您可以选择以下选项:

  • 使用@Transactional(readOnly=true) - 目的是拥有只读事务。我推荐一个
  • 使用注入EntityManager的JPA @PersistenceContext。它将为每次调用打开一个新的基础会话。不是那么好的选择。但是您应该考虑将EntityManager与readOnly = true事务
  • 一起使用
  • 使用其他方面/拦截器/过滤器来打开和关闭会话。这很难,你最终可能会对hibernate当前会话概念的春季实现感到困惑。