在哪里使用@Transactional注解和@Repository注解
Where to use @Transactional annotation and @Repository annotation
互联网上的一些示例在 DAO 实现方法上使用 @Transactional
注释,而一些在服务层方法上使用此注释。 @Transactional
放在哪里更合适,为什么?
同样在哪里放置@Repository
注释。在 DAO 接口上还是在 DAO 实现上?
我一直在它们的实现中使用 @Service
和 @Repository
注释,但它们可以放在任何一个中。虽然,将它放在一个接口上意味着您将无法拥有多个实现,因为您会收到 NoUniqueBeanDefinitionException
错误。
在@Transactional
的情况下,视情况而定,但通常会在服务上进行。如果您希望能够在一个事务中添加各种数据库调用,那么它应该放在服务中。如果您想进行小额交易,那么在 DAO 上最好,但是那样的话,您将无法在一个交易中修改多个表。将它放在 DAO 上的另一个缺点是,您将无法回滚多个修改,只能回滚那些 bing 由 DAO 执行的修改。
编辑
在使用 Spring 的几个项目之后,每个项目的比例都不同,我最终改变了自己的做法。我想补充一点,尽管将 @Transactional
添加到服务层并不是完全不好的做法,但它可能会对应用程序的性能产生负面影响。所以根据我自己的经验,最好将它添加到 DAO/Repository
层,并且只在 服务层 的功能级别添加,如果事务必须是 原子.
还有一点,如果您使用Spring Data
,则必须在界面上添加@Repository
。只有扩展 JpaRepository
才需要在实现上添加 @Repository
注释。在这种情况下,JpaRepository
的接口和自定义实现都将具有 @Repository
.
互联网上的一些示例在 DAO 实现方法上使用 @Transactional
注释,而一些在服务层方法上使用此注释。 @Transactional
放在哪里更合适,为什么?
同样在哪里放置@Repository
注释。在 DAO 接口上还是在 DAO 实现上?
我一直在它们的实现中使用 @Service
和 @Repository
注释,但它们可以放在任何一个中。虽然,将它放在一个接口上意味着您将无法拥有多个实现,因为您会收到 NoUniqueBeanDefinitionException
错误。
在@Transactional
的情况下,视情况而定,但通常会在服务上进行。如果您希望能够在一个事务中添加各种数据库调用,那么它应该放在服务中。如果您想进行小额交易,那么在 DAO 上最好,但是那样的话,您将无法在一个交易中修改多个表。将它放在 DAO 上的另一个缺点是,您将无法回滚多个修改,只能回滚那些 bing 由 DAO 执行的修改。
编辑
在使用 Spring 的几个项目之后,每个项目的比例都不同,我最终改变了自己的做法。我想补充一点,尽管将 @Transactional
添加到服务层并不是完全不好的做法,但它可能会对应用程序的性能产生负面影响。所以根据我自己的经验,最好将它添加到 DAO/Repository
层,并且只在 服务层 的功能级别添加,如果事务必须是 原子.
还有一点,如果您使用Spring Data
,则必须在界面上添加@Repository
。只有扩展 JpaRepository
才需要在实现上添加 @Repository
注释。在这种情况下,JpaRepository
的接口和自定义实现都将具有 @Repository
.