Итак, я родом из Spring Boot, и я был действительно впечатлен тем, как аннотация Spring @Transactional
просто работала без проблем вместе с Hibernate. Сейчас я работаю над приложением Dropwizard, которое использует Jdbi3
. И я нашел похожую аннотацию @Transaction
, которая работает точно так же, как Spring
, но с некоторыми предварительными условиями.
Весна
Таким образом, в соответствии с рекомендациями Spring, 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
иjdbi.useTransaction
. Но в этом случае мне приходится прикреплять каждыйDao
вручную. Есть ли лучший способ сделать это?
Спасибо