如何在Spring Data中使用@Transactional?
我刚刚开始从事Spring数据,Hibernate,MySQL,JPA项目。我切换到spring-data,这样我就不必担心手动创建查询。
我注意到@Transactional
当你使用spring-data
时不需要使用,因为我也尝试了不带注释的查询。
有特定的原因为什么我应该/不应该使用@Transactional
注释?
作品:
@Transactionalpublic List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
也可以:
‘public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}‘
提前致谢!
回答:
你实际上在问什么?@Repository
注释或的用法@Transactional
。
@Repository
根本不需要,因为你声明的接口将由Spring Data基础结构创建并激活异常转换的代理支持。因此,在Spring Data仓库接口上使用此批注根本没有任何作用。
@Transactional
-对于JPA模块,我们在支持代理(SimpleJpaRepository
)的实现类上具有此批注。这有两个原因:首先,持久化和删除对象需要JPA中的事务。因此,我们需要确保事务正在运行,方法是使用注释方法@Transactional
。
像findAll()
和findOne(…)
这样使用的读取方法@Transactional(readOnly = true)
并非绝对必要,但会触发事务基础结构中的一些优化(将设置为FlushMode,MANUAL以使持久性提供程序在关闭时可能会跳过脏检查EntityManager
)。除此之外,该标志还在JDBC连接上设置,这会导致对该级别的进一步优化。
根据你使用的数据库的不同,它可能会忽略表锁,甚至拒绝你可能意外触发的写操作。因此,我们建议也使用@Transactional(readOnly = true)for
查询方法,你可以轻松地实现将该注释添加到存储库接口。确保@Transactional
在该接口中可能已声明或重新装饰的操作方法上添加一个普通格式。
以上是 如何在Spring Data中使用@Transactional? 的全部内容, 来源链接: utcz.com/qa/405547.html