如何在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

最好的祝福