diff --git a/jta/README.md b/jta/README.md deleted file mode 100644 index 202019118d..0000000000 --- a/jta/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## JTA - -This module contains articles about the Java Transaction API (JTA). - -### Relevant Articles: -- [Guide to Jakarta EE JTA](https://www.baeldung.com/jee-jta) diff --git a/jta/pom.xml b/jta/pom.xml deleted file mode 100644 index 906d28a7ea..0000000000 --- a/jta/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - jta - 1.0-SNAPSHOT - jta - jar - JEE JTA demo - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - import - pom - - - - - - - org.springframework.boot - spring-boot-starter-jta-bitronix - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.boot - spring-boot-starter - - - org.hsqldb - hsqldb - - - - - 2.4.7 - 2.17.1 - - - \ No newline at end of file diff --git a/jta/src/main/resources/application.properties b/jta/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/jta/src/main/resources/resources b/jta/src/main/resources/resources deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/jta/src/main/resources/resources +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/jta/src/test/resources/logback-test.xml b/jta/src/test/resources/logback-test.xml deleted file mode 100644 index 8d4771e308..0000000000 --- a/jta/src/test/resources/logback-test.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n - - - - - - - \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple/.gitignore b/persistence-modules/spring-persistence-simple/.gitignore index 83c05e60c8..83d8f1a221 100644 --- a/persistence-modules/spring-persistence-simple/.gitignore +++ b/persistence-modules/spring-persistence-simple/.gitignore @@ -6,6 +6,7 @@ /data /src/main/webapp/WEB-INF/classes */META-INF/* +/transaction-logs # Packaged files # *.jar diff --git a/persistence-modules/spring-persistence-simple/README.md b/persistence-modules/spring-persistence-simple/README.md index f118d12f6f..77af323e31 100644 --- a/persistence-modules/spring-persistence-simple/README.md +++ b/persistence-modules/spring-persistence-simple/README.md @@ -8,6 +8,7 @@ - [Transactional Annotations: Spring vs. JTA](https://www.baeldung.com/spring-vs-jta-transactional) - [Test a Mock JNDI Datasource with Spring](https://www.baeldung.com/spring-mock-jndi-datasource) - [Detecting If a Spring Transaction Is Active](https://www.baeldung.com/spring-transaction-active) +- [Guide to Jakarta EE JTA](https://www.baeldung.com/jee-jta) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml index d9b832df2d..c486a95e96 100644 --- a/persistence-modules/spring-persistence-simple/pom.xml +++ b/persistence-modules/spring-persistence-simple/pom.xml @@ -51,6 +51,21 @@ spring-boot-starter ${spring-boot-starter.version} + + org.springframework.boot + spring-boot-starter-jta-atomikos + ${spring-boot-starter.version} + + + org.springframework.boot + spring-boot-starter-jdbc + ${spring-boot-starter.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + com.h2database h2 @@ -79,15 +94,13 @@ - - 5.2.4.RELEASE - 2.3.3.RELEASE - + 5.3.18 + 2.6.6 2.2 1.3 2.2.7.RELEASE - 0.23.0 + 2.5.2 \ No newline at end of file diff --git a/jta/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java similarity index 92% rename from jta/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java index 4d8779efe5..b2c0b7ff5a 100644 --- a/jta/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/JtaDemoApplication.java @@ -3,7 +3,7 @@ package com.baeldung.jtademo; import org.hsqldb.jdbc.pool.JDBCXADataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jta.bitronix.BitronixXADataSourceWrapper; +import org.springframework.boot.jta.atomikos.AtomikosXADataSourceWrapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -32,7 +32,7 @@ public class JtaDemoApplication { JDBCXADataSource dataSource = new JDBCXADataSource(); dataSource.setUrl(connectionUrl); dataSource.setUser("sa"); - BitronixXADataSourceWrapper wrapper = new BitronixXADataSourceWrapper(); + AtomikosXADataSourceWrapper wrapper = new AtomikosXADataSourceWrapper(); return wrapper.wrapDataSource(dataSource); } diff --git a/jta/src/main/java/com/baeldung/jtademo/dto/TransferLog.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/dto/TransferLog.java similarity index 100% rename from jta/src/main/java/com/baeldung/jtademo/dto/TransferLog.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/dto/TransferLog.java diff --git a/jta/src/main/java/com/baeldung/jtademo/services/AuditService.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/AuditService.java similarity index 68% rename from jta/src/main/java/com/baeldung/jtademo/services/AuditService.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/AuditService.java index f6810e15c8..48890e6957 100644 --- a/jta/src/main/java/com/baeldung/jtademo/services/AuditService.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/AuditService.java @@ -4,7 +4,6 @@ import com.baeldung.jtademo.dto.TransferLog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -24,10 +23,17 @@ public class AuditService { } public TransferLog lastTransferLog() { - return jdbcTemplate.query("select FROM_ACCOUNT,TO_ACCOUNT,AMOUNT from AUDIT_LOG order by ID desc", (ResultSetExtractor) (rs) -> { - if (!rs.next()) - return null; - return new TransferLog(rs.getString(1), rs.getString(2), BigDecimal.valueOf(rs.getDouble(3))); + return jdbcTemplate.query( + "select FROM_ACCOUNT,TO_ACCOUNT,AMOUNT from AUDIT_LOG order by ID desc", + rs -> { + if (!rs.next()) { + return null; + } + return new TransferLog( + rs.getString(1), + rs.getString(2), + BigDecimal.valueOf(rs.getDouble(3)) + ); }); } } diff --git a/jta/src/main/java/com/baeldung/jtademo/services/BankAccountService.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/BankAccountService.java similarity index 77% rename from jta/src/main/java/com/baeldung/jtademo/services/BankAccountService.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/BankAccountService.java index 0c881edbaa..7ed06e9529 100644 --- a/jta/src/main/java/com/baeldung/jtademo/services/BankAccountService.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/BankAccountService.java @@ -3,7 +3,6 @@ package com.baeldung.jtademo.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -24,9 +23,12 @@ public class BankAccountService { } public BigDecimal balanceOf(String accountId) { - return jdbcTemplate.query("select BALANCE from ACCOUNT where ID=?", new Object[] { accountId }, (ResultSetExtractor) (rs) -> { + return jdbcTemplate.query( + "select BALANCE from ACCOUNT where ID=?", + new Object[] { accountId }, + rs -> { rs.next(); - return new BigDecimal(rs.getDouble(1)); - }); + return BigDecimal.valueOf(rs.getDouble(1)); + }); } } diff --git a/jta/src/main/java/com/baeldung/jtademo/services/TellerService.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/TellerService.java similarity index 100% rename from jta/src/main/java/com/baeldung/jtademo/services/TellerService.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/TellerService.java diff --git a/jta/src/main/java/com/baeldung/jtademo/services/TestHelper.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/TestHelper.java similarity index 94% rename from jta/src/main/java/com/baeldung/jtademo/services/TestHelper.java rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/TestHelper.java index c1e8e355ec..60bccd4847 100644 --- a/jta/src/main/java/com/baeldung/jtademo/services/TestHelper.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jtademo/services/TestHelper.java @@ -32,10 +32,10 @@ public class TestHelper { runScript("audit.sql", jdbcTemplateAudit.getDataSource()); } - private void runScript(String scriptName, DataSource dataSouorce) throws SQLException { + private void runScript(String scriptName, DataSource dataSource) throws SQLException { DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); Resource script = resourceLoader.getResource(scriptName); - try (Connection con = dataSouorce.getConnection()) { + try (Connection con = dataSource.getConnection()) { ScriptUtils.executeSqlScript(con, script); } } diff --git a/jta/src/main/resources/account.sql b/persistence-modules/spring-persistence-simple/src/main/resources/account.sql similarity index 100% rename from jta/src/main/resources/account.sql rename to persistence-modules/spring-persistence-simple/src/main/resources/account.sql diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/application.properties b/persistence-modules/spring-persistence-simple/src/main/resources/application.properties new file mode 100644 index 0000000000..f3872aa268 --- /dev/null +++ b/persistence-modules/spring-persistence-simple/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.jta.atomikos.properties.log-base-name=atomikos-log diff --git a/jta/src/main/resources/audit.sql b/persistence-modules/spring-persistence-simple/src/main/resources/audit.sql similarity index 100% rename from jta/src/main/resources/audit.sql rename to persistence-modules/spring-persistence-simple/src/main/resources/audit.sql diff --git a/jta/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java similarity index 79% rename from jta/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java index 3f6004262b..c79a42fb4b 100644 --- a/jta/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java +++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jtademo/JtaDemoUnitTest.java @@ -5,19 +5,19 @@ import com.baeldung.jtademo.services.AuditService; import com.baeldung.jtademo.services.BankAccountService; import com.baeldung.jtademo.services.TellerService; import com.baeldung.jtademo.services.TestHelper; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.math.BigDecimal; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest(classes = JtaDemoApplication.class) public class JtaDemoUnitTest { @Autowired @@ -32,31 +32,31 @@ public class JtaDemoUnitTest { @Autowired AuditService auditService; - @Before + @BeforeEach public void beforeTest() throws Exception { testHelper.runAuditDbInit(); testHelper.runAccountDbInit(); } @Test - public void givenAnnotationTx_whenNoException_thenAllCommitted() throws Exception { + public void givenAnnotationTx_whenNoException_thenAllCommitted() { tellerService.executeTransfer("a0000001", "a0000002", BigDecimal.valueOf(500)); assertThat(accountService.balanceOf("a0000001")).isEqualByComparingTo(BigDecimal.valueOf(500)); assertThat(accountService.balanceOf("a0000002")).isEqualByComparingTo(BigDecimal.valueOf(2500)); TransferLog lastTransferLog = auditService.lastTransferLog(); - assertThat(lastTransferLog).isNotNull(); + assertThat(lastTransferLog.getFromAccountId()).isEqualTo("a0000001"); assertThat(lastTransferLog.getToAccountId()).isEqualTo("a0000002"); assertThat(lastTransferLog.getAmount()).isEqualByComparingTo(BigDecimal.valueOf(500)); } @Test - public void givenAnnotationTx_whenException_thenAllRolledBack() throws Exception { - assertThatThrownBy(() -> { - tellerService.executeTransfer("a0000002", "a0000001", BigDecimal.valueOf(100000)); - }).hasMessage("Insufficient fund."); + public void givenAnnotationTx_whenException_thenAllRolledBack() { + assertThatThrownBy( + () -> tellerService.executeTransfer("a0000002", "a0000001", BigDecimal.valueOf(100000)) + ).hasMessage("Insufficient fund."); assertThat(accountService.balanceOf("a0000001")).isEqualByComparingTo(BigDecimal.valueOf(1000)); assertThat(accountService.balanceOf("a0000002")).isEqualByComparingTo(BigDecimal.valueOf(2000)); @@ -67,22 +67,21 @@ public class JtaDemoUnitTest { public void givenProgrammaticTx_whenCommit_thenAllCommitted() throws Exception { tellerService.executeTransferProgrammaticTx("a0000001", "a0000002", BigDecimal.valueOf(500)); - BigDecimal result = accountService.balanceOf("a0000001"); assertThat(accountService.balanceOf("a0000001")).isEqualByComparingTo(BigDecimal.valueOf(500)); assertThat(accountService.balanceOf("a0000002")).isEqualByComparingTo(BigDecimal.valueOf(2500)); TransferLog lastTransferLog = auditService.lastTransferLog(); - assertThat(lastTransferLog).isNotNull(); + assertThat(lastTransferLog.getFromAccountId()).isEqualTo("a0000001"); assertThat(lastTransferLog.getToAccountId()).isEqualTo("a0000002"); assertThat(lastTransferLog.getAmount()).isEqualByComparingTo(BigDecimal.valueOf(500)); } @Test - public void givenProgrammaticTx_whenRollback_thenAllRolledBack() throws Exception { - assertThatThrownBy(() -> { - tellerService.executeTransferProgrammaticTx("a0000002", "a0000001", BigDecimal.valueOf(100000)); - }).hasMessage("Insufficient fund."); + public void givenProgrammaticTx_whenRollback_thenAllRolledBack() { + assertThatThrownBy( + () -> tellerService.executeTransferProgrammaticTx("a0000002", "a0000001", BigDecimal.valueOf(100000)) + ).hasMessage("Insufficient fund."); assertThat(accountService.balanceOf("a0000001")).isEqualByComparingTo(BigDecimal.valueOf(1000)); assertThat(accountService.balanceOf("a0000002")).isEqualByComparingTo(BigDecimal.valueOf(2000)); diff --git a/pom.xml b/pom.xml index 39ffc54211..441cf0e580 100644 --- a/pom.xml +++ b/pom.xml @@ -476,7 +476,6 @@ json-2 json-path jsoup - jta kubernetes ksqldb @@ -963,7 +962,6 @@ json-2 json-path jsoup - jta ksqldb