spring - 在哪里使用@Transactional注解和@Repository注解
问题描述
Internet 上的一些示例在@Transactional
DAO 实现方法上使用了注解,而有些则将此注解用于服务层方法。放在哪里更合适@Transactional
?为什么?
同样在哪里放置@Repository
注释。在 DAO 接口上还是在 DAO 实现上?
解决方案
我一直在他们的实现上使用@Service
和@Repository
注释,但它们可以放在任何一个中。虽然,把它放在一个接口上意味着你不能有多个实现,因为你会得到一个NoUniqueBeanDefinitionException
错误。
在 的情况下@Transactional
,这取决于,但通常它会在服务上进行。如果您希望能够在一个事务上添加各种数据库调用,那么它应该进入服务。如果您想进行小事务,那么在 DAO 上是最好的,但是,您将无法在一个事务中修改多个表。将它放在 DAO 上的另一个缺点是,您将无法回滚多个修改,只能回滚由 DAO 执行的修改。
编辑
在使用了几个不同比例的 Spring 项目之后,我最终改变了自己的做法。我想补充一点,即使添加@Transactional
到服务层并不是一个坏习惯,它也会对应用程序的性能产生负面影响。所以根据我自己的经验,如果事务必须是原子DAO/Repository
的,最好将其添加到层中,并且仅在服务层的功能级别添加。
还有一件事,如果你正在使用Spring Data
,@Repository
必须在界面上添加。仅当您扩展JpaRepository
遗嘱时,您才需要@Repository
在实现上添加注释。在这种情况下,JpaRepository
和自定义实现的接口都将具有@Repository
.
推荐阅读
- c# - 如果 ViewBag.Elements 为空,则 MVC 重定向
- apache-kafka - 如何获取Kafka主题的序列化格式?
- mysql - 使用 HAVING 子句获取 ROLLUP Total
- sass - Jekyll 和 Sass 找不到或无法读取要导入的文件
- ios - UICollectionView 没有通过 cellForItemAt 正确更新所有单元格
- amazon-web-services - 更新 Redshift 集群的 KMS 密钥如何影响数据库和架构?
- sql - SQL 添加#前缀
- python - 变量范围(局部全局和非局部)如何适用于 Python 中的 List 等可变对象?
- css - 旋转css网格项目以创建垂直文本:如何扩展项目新的垂直高度以适合文本?
- python - 如何重塑 Pandas MultiIndex Dataframe(转置每个类别的行,并将它们作为列彼此相邻并保持索引相同)