注意到如果我想读取一些数据,如果我没有事务上下文,我将无法这样做,因为
org.hibernate.HibernateException: No Session found for current thread
对于读取数据,通常不需要事务.
因此,为了让Spring管理会话,即使对于只读操作,它也需要进行交易…?
这不是开销吗?
PS.I不想手动打开和关闭会话…
非常感谢.
最佳答案
@Transactional告诉spring打开和关闭一个会话,除了指示它启动并提交一个事务.这不是很简单,但它是如何工作的.因此,如果您没有@Transactional,则不会打开任何会话.以下是您的选择:
>使用@Transactional(readOnly = true) – 目的是拥有只读事务.我推荐一个
>使用注入了@PersistenceContext的JPA EntityManager.它将为每次调用打开一个新的基础会话.不是那么好的选择.但是您应该考虑将EntityManager与readOnly = true事务一起使用
>使用其他方面/拦截器/过滤器来打开和关闭会话.这很难,你最终会对hibernate当前会话概念的spring实现感到困惑.