在哪里使用@Transactional注解和@Repository注解

Posted

技术标签:

【中文标题】在哪里使用@Transactional注解和@Repository注解【英文标题】:Where to use @Transactional annotation and @Repository annotation 【发布时间】:2018-10-23 22:56:34 【问题描述】:

互联网上的一些例子在DAO实现方法上使用了@Transactional注解,而一些在服务层方法上使用了这个注解。将@Transactional 放在哪里更合适?为什么?

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

【问题讨论】:

【参考方案1】:

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

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

编辑

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

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

【讨论】:

以上是关于在哪里使用@Transactional注解和@Repository注解的主要内容,如果未能解决你的问题,请参考以下文章

@EnableTransactionManagement以及 @Transactional 注解

spring @Transactional 事务注解的坑

@Transactional注解详细解读

初步理解@Transactional注解

Spring @Transactional 使用

@Transactional注解详细使用