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

Nav*_*ngh 5 orm spring annotations spring-transactions

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

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

Ala*_*ruz 4

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

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

编辑

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

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