首页 > 解决方案 > 在哪里使用@Transactional注解和@Repository注解

问题描述

Internet 上的一些示例在@TransactionalDAO 实现方法上使用了注解,而有些则将此注解用于服务层方法。放在哪里更合适@Transactional?为什么?

同样在哪里放置@Repository注释。在 DAO 接口上还是在 DAO 实现上?

标签: springormannotationsspring-transactions

解决方案


我一直在他们的实现上使用@Service@Repository注释,但它们可以放在任何一个中。虽然,把它放在一个接口上意味着你不能有多个实现,因为你会得到一个NoUniqueBeanDefinitionException错误。

在 的情况下@Transactional,这取决于,但通常它会在服务上进行。如果您希望能够在一个事务上添加各种数据库调用,那么它应该进入服务。如果您想进行小事务,那么在 DAO 上是最好的,但是,您将无法在一个事务中修改多个表。将它放在 DAO 上的另一个缺点是,您将无法回滚多个修改,只能回滚由 DAO 执行的修改。

编辑

在使用了几个不同比例的 Spring 项目之后,我最终改变了自己的做法。我想补充一点,即使添加@Transactional到服务层并不是一个坏习惯,它也会对应用程序的性能产生负面影响。所以根据我自己的经验,如果事务必须是原子DAO/Repository的,最好将其添加到层中,并且仅在服务层的功能级别添加。

还有一件事,如果你正在使用Spring Data@Repository必须在界面上添加。仅当您扩展JpaRepository遗嘱时,您才需要@Repository在实现上添加注释。在这种情况下,JpaRepository和自定义实现的接口都将具有@Repository.


推荐阅读