所以我来自 Spring Boot 背景,我对 Spring@Transactional
注解如何与 Hibernate 无缝协作印象深刻。我现在正在开发一个 Dropwizard 应用程序,该应用程序正在使用Jdbi3
. 而且我发现了一个类似的注释,它的工作方式与某些先决条件@Transaction
完全相同。Spring
春天
所以根据 Spring Guidelines,Repository
和Controller
是分别与数据库和 HTTP 请求通信的两个接口,Service
Layer 是所有业务逻辑所在的地方。总是有这样一种情况,服务中的单个方法使用多个存储库执行 CRUD 操作。因此,让服务方法使用 注释非常有意义@Transational
。
Jdbi 与 Dropwizard
如果我错了,请纠正我。在这里Jdbi
,Repository
成为Dao
,Controller
成为Resource
,Service
留下Service
。也许不同的人使用不同的层架构,但让我们假设这是我的问题所在的情况。
问题陈述
我希望在 Jdbi 中实现与 Spring 中相同的事务处理,因为它对我来说更有意义,而无需添加任何额外的层。这是我将抛出一些代码,我希望实现的目标:
Dao1.kt
interface Dao1{
@SqlUpdate("INSERT INTO table1...")
fun insert() : Int
}
Dao2.kt
interface Dao2{
@SqlUpdate("INSERT INTO table2...")
fun insert() : Int
}
Service.kt
class Service{
@Transaction
fun save() {
Dao1 =Dao1() //What should be expected way to instantiate
Dao2 =Dao2() //What should be expected way to instantiate
dao1.insert()
dao2.insert()
}
}
需要注意的几点
我知道
onDemand
只能在abstract
类或接口上使用,因此我无法Service
使用onDemand
. 我也不能做我的Service
摘要。很少有文章建议做一个摘要
Repository
并Transaction
在那里使用。但是根据我想到存储库时的想法,我看到它与entity/table
. 或者可能是相关实体。所以如果我想在同一个服务方法中更新movie
和user
表,将这两个事务语句放在一个方法下XRepository
对我来说听起来很荒谬。它是业务逻辑的一部分,应该驻留在Service
.我想我可以使用
jdbi.inTransaction
andjdbi.useTransaction
。Dao
但在那种情况下,我必须手动附加每一个。有没有更好的方法来做到这一点?
谢谢