java - 通过 Spring + Hibernate 只读数据

标签 java spring hibernate transactions

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

org.hibernate.HibernateException: No Session found for current thread

对于读取数据,通常不需要事务。

因此,为了让 Spring 管理 session ,即使对于只读操作(如选择...),它也需要有一个事务?

这不是开销吗?

PS.我不想手动打开和关闭 session ...

非常感谢。

最佳答案

@Transactional 除了指示 spring 启动和提交事务外,还告诉 spring 打开和关闭 session 。这不是很简单,但这就是它的工作原理。因此,如果您没有 @Transactional,则不会打开任何 session 。以下是您的选择:

  • 使用 @Transactional(readOnly=true) - 目的是进行只读事务。我推荐那个
  • 使用注入(inject)了 @PersistenceContext 的 JPA EntityManager。它将为每次调用打开一个新的底层 session 。不是那么好的选择。但是您应该考虑将 EntityManager 与 readOnly=true 事务一起使用
  • 使用额外的方面/拦截器/过滤器来打开和关闭 session 。这很难,而且您最终可能会对 hibernate 当前 session 概念的 spring 实现感到困惑。

关于java - 通过 Spring + Hibernate 只读数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692431/

相关文章:

java netcdf 4 教程

java - 使用 Spring JdbcTemplate

spring - 如何在 Spock 测试中将 @Value 注释与 Spring PropertyPlaceholderConfigurer 一起使用?

java - 如何在 JPA 中创建具有预定义值的表

java - Java 是否使用字符串实现享元设计模式?

java - 我的代码中出现 ArrayIndexOutOfBoundsException

java - 以编程方式启动和停止 Spring Integration 中的某些 IntegrationFlows?

java - 如何通过与 hibernate 的多对多关系级联保存?

java - 通过条件检索日期失败

java - 在 cmd 提示符下编译并运行在 Eclipse 上编写的 java 代码