diff --git a/persistence-modules/spring-boot-persistence-4/pom.xml b/persistence-modules/spring-boot-persistence-4/pom.xml index 75b444f7cc..d4bf8ba5cb 100644 --- a/persistence-modules/spring-boot-persistence-4/pom.xml +++ b/persistence-modules/spring-boot-persistence-4/pom.xml @@ -60,6 +60,11 @@ ${lombok.version} provided + + org.springframework + spring-tx + ${spring.tx.version} + @@ -84,6 +89,7 @@ 3.2.0 1.16.1 1.18.30 + 6.1.4 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/Account.java b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/Account.java new file mode 100644 index 0000000000..6bb070cad2 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/Account.java @@ -0,0 +1,23 @@ +package com.baeldung.transactionalandasync; + +import jakarta.persistence.*; +import lombok.*; + +import java.math.BigDecimal; + +@Entity +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(of = {"id"}) +@Table(name = "account") +@Data +public class Account { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + + @Column(name = "balance") + private BigDecimal balance; +} diff --git a/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountRepository.java b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountRepository.java new file mode 100644 index 0000000000..a3c15e25eb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountRepository.java @@ -0,0 +1,6 @@ +package com.baeldung.transactionalandasync; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AccountRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountService.java b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountService.java new file mode 100644 index 0000000000..d54f90e2e5 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/AccountService.java @@ -0,0 +1,41 @@ +package com.baeldung.transactionalandasync; + +import jakarta.transaction.Transactional; +import lombok.AllArgsConstructor; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +@Service +@AllArgsConstructor +@Transactional +public class AccountService { + + private final AccountRepository accountRepository; + + @Async + public void transferAsync(Long depositorId, Long favoredId, BigDecimal amount) { + transfer(depositorId, favoredId, amount); + + printReceipt(); + } + + @Transactional + public void transfer(Long depositorId, Long favoredId, BigDecimal amount) { + Account depositorAccount = accountRepository.findById(depositorId) + .orElseThrow(IllegalArgumentException::new); + Account favoredAccount = accountRepository.findById(favoredId) + .orElseThrow(IllegalArgumentException::new); + + depositorAccount.setBalance(depositorAccount.getBalance().subtract(amount)); + favoredAccount.setBalance(favoredAccount.getBalance().add(amount)); + + accountRepository.save(depositorAccount); + accountRepository.save(favoredAccount); + } + + public void printReceipt() { + // logic to print the receipt + } +} diff --git a/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/BankAccountApplication.java b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/BankAccountApplication.java new file mode 100644 index 0000000000..403a098df8 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-4/src/main/java/com/baeldung/transactionalandasync/BankAccountApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.transactionalandasync; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BankAccountApplication { + public static void main(String[] args) { + SpringApplication.run(BankAccountApplication.class, args); + } + +}