У меня есть ситуация, когда мне приходится выбирать между двумя вариантами, и мне не ясно, в чем разница между этими вариантами. Я буду очень благодарен, если кто-нибудь сможет объяснить мне, какой мне выбрать и почему. Короче говоря, у меня есть простая сущность JPA (Kotlin язык):
@Entity
@Table(name = "account")
data class AccountEntity(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long,
var balance: Int,
@ManyToOne
var accountType: AccountTypeEntity
)
А в слое business-logi c я хочу иметь метод для обновления баланса счета по его accountId. В основном мне нужно загрузить сущность учетной записи по идентификатору, затем установить новый баланс и, наконец, использовать метод сохранения, предоставленный Hibernate. Но я также обнаружил тот факт, что мне не нужно вызывать метод save в явном виде, если мой метод будет помечен @transactional. Итак, с этого момента у меня есть два варианта
Первый
fun updateAccountBalance(id: Long, balance: Int) {
val account = accountRepository.findById(id).orElseThrow { RuntimeException("No account with id=$id found") }
account.balance = balance
accountRepository.save(account)
}
Второй
@Transactional
fun updateAccountBalance(id: Long, balance: Int) {
val account = accountRepository.findById(id).orElseThrow { RuntimeException("No account with id=$id found") }
account.balance = balance
}
Во-первых, для меня не ясно, в чем будет разница этих варианты с точки зрения базы данных. Не могли бы вы уточнить это?
Во-вторых, я думаю, что в таком методе мне вообще не нужен TRANSACTION (с точки зрения базы данных), потому что я делаю только одну операцию записи и для меня это выглядит избыточным использовать, чтобы избежать вызова метода сохранения Hibernate в явном виде. Но, может быть, я ошибаюсь и есть некоторые причины использовать транзакцию даже здесь. Поэтому, пожалуйста, поправьте меня.