如何在Spring数据中使用@Transactional?
我刚刚开始研究Spring-data,Hibernate,MySQL和JPA项目。 我切换到spring-data,这样我就不用担心手工创build查询。
我注意到,当使用spring-data时,不需要使用@Transactional,因为我也尝试了没有注解的查询。
是否有一个特定的原因,我应该/不应该使用@Repository注释?
作品:
@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
,因为您声明的接口将由Spring Data基础设施创build的代理支持,并激活exception转换。 所以在Spring Data repository接口上使用这个注解根本没有任何作用。
@Transactional
– 对于JPA模块,我们在支持代理的实现类( SimpleJpaRepository
)上有这个注释。 这有两个原因:首先,持久化和删除对象需要JPA中的事务。 因此,我们需要确保一个事务正在运行,我们通过@Transactional
注释方法。
像findAll()
和findOne(…)
这样的阅读方法正在使用@Transactional(readOnly = true)
,它并不是绝对必要的,但会触发事务基础结构中的一些优化(将FlushMode
设置为MANUAL
使持久性提供程序在closures时可能跳过脏检查EntityManager
)。 除此之外,该标志也设置在JDBC连接上,从而在该级别上进一步优化。
根据您使用的数据库,可以省略表锁,甚至拒绝可能意外触发的写操作。 因此,我们推荐使用@Transactional(readOnly = true)
作为查询方法,您可以轻松地将该注释添加到存储库接口中。 确保你添加一个纯粹的@Transactional
到你可能已经声明或重新装饰的操作方法。
你应该使用@Repository
注解
这是因为@Repository用于将未经检查的SQLexception转换为Spring Excpetion,并且唯一的exception是DataAccessException
我认为这个问题稍微宽一些,不能在数据访问层的注释上减less。 我们需要考虑整个应用程序的堆栈,我们想要应用的事务策略等等。 IBM developerworks网站上的Mark Richards有关这个主题的非常全面的文章。 您可以在这里find第一个: http : //www.ibm.com/developerworks/java/library/j-ts1/index.html
最好的祝福