我刚开始从事 Spring-data、Hibernate、MySQL、JPA 项目。我切换到 spring-data 这样我就不必担心手动创建查询了。
我注意到,当您使用 spring-data 时,不需要使用 @Transactional
,因为我也尝试了没有注释的查询。
我应该/不应该使用 @Transactional
注释有什么具体原因吗?
作品:
@Transactional
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
同样有效:
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
最佳答案
您的问题实际上是关于什么的? @Repository
注释或 @Transactional
的用法。
@Repository
根本不需要,因为您声明的接口(interface)将由 Spring Data 基础架构创建并激活异常转换的代理支持。所以在 Spring Data 存储库接口(interface)上使用这个注解根本没有任何效果。
@Transactional
- 对于 JPA 模块,我们在支持代理 ( SimpleJpaRepository
) 的实现类上有这个注释。这有两个原因:首先,持久化和删除对象需要 JPA 中的事务。因此,我们需要确保事务正在运行,我们通过使用 @Transactional
注释方法来做到这一点。
findAll()
和 findOne(…)
等读取方法正在使用 @Transactional(readOnly = true)
,这不是绝对必要的,但触发事务基础结构中的一些优化(将 FlushMode
设置为 MANUAL
以让持久性提供程序在关闭 EntityManager
时可能跳过脏检查)。除此之外,该标志也在 JDBC 连接上设置,这会导致该级别的进一步优化。
根据您使用的数据库,它可以忽略表锁,甚至拒绝您可能意外触发的写入操作。因此,我们建议将 @Transactional(readOnly = true)
用于查询方法,您可以轻松地实现将注释添加到存储库接口(interface)。确保将纯 @Transactional
添加到您可能在该接口(interface)中声明或重新装饰的操作方法。
关于java - 如何将 @Transactional 与 Spring Data 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394857/