如何在Spring Data中使用@Transactional?

Byr*_*ach 68 java spring jpa spring-data spring-data-jpa

我刚刚开始研究Spring-data,Hibernate,MySQL,JPA项目.我切换到spring-data,这样我就不用担心手工创建查询了.

我注意到@Transactional当你使用spring-data时不需要使用,因为我也在没有注释的情况下尝试了我的查询.

我应该/不应该使用@Transactional注释的具体原因是什么?

作品:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}
Run Code Online (Sandbox Code Playgroud)

还有效:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Oli*_*ohm 118

你的问题实际上是什么?@Repository注释的用法或@Transactional.

@Repository完全不需要,因为您声明的接口将由代理支持,Spring Data基础架构无论如何都会创建并激活异常转换.因此,在Spring Data存储库接口上使用此注释根本没有任何效果.

@Transactional- 对于JPA模块,我们在支持proxy(SimpleJpaRepository)的实现类上有这个注释.这有两个原因:首先,持久化和删除对象需要JPA中的事务.因此,我们需要确保一个事务正在运行,我们通过使用该方法进行注释来完成@Transactional.

阅读类似的方法findAll(),并findOne(…)利用@Transactional(readOnly = true)这不是严格必要的,但触发了交易基础设施的几个优化(设置FlushModeMANUAL让收盘时,持久性提供可能跳过脏检查EntityManager).除此之外,该标志也在JDBC连接上设置,这导致该级别的进一步优化.

根据您使用的数据库,它可以省略表锁,甚至拒绝您可能意外触发的写操作.因此,我们建议您使用@Transactional(readOnly = true)查询方法,您可以轻松地将该注释添加到存储库接口.确保@Transactional在您可能已在该界面中声明或重新装饰的操作方法中添加一个plain .

  • 究竟.最简单的方法是在接口上使用`@Transactional(readOnly = true)`(因为它通常包含finder方法),并使用简单的`@Transactional`覆盖每个修改查询方法的此设置.这实际上是在SimpleJpaRepositoy中完成的方式. (16认同)
  • 在本文的这一部分,接近一切都是错误的.通过指示您没有编写,JDBC驱动可以(将)提高数据库交互的性能.它还可以检测和拒绝意外发出的写入.最重要的是,Spring在只读模式下禁用JPA/Hibernate刷新,这会在您读取大对象图时极大地影响性能,因为提供程序不需要对其执行脏检查.该标志可能对交易本身没有太大影响,但到目前为止还没有考虑到的一切. (8认同)
  • 简而言之:我应该在所有DAO方法的选择查询上使用@Transactional添加/编辑/删除查询和@Transaction(readOnly = true)? (6认同)
  • 顺便说一句,不要忘记在任何“@Configuration”类上使用“@EnableTransactionManagement”,以便“@Transactional”正常工作 (2认同)