From e34eb87e8e2b0ffd125dbc4591bdd8e1d5f33bfa Mon Sep 17 00:00:00 2001 From: Wynn Teo <49014791+wynnteo@users.noreply.github.com> Date: Fri, 12 Apr 2024 08:23:17 +0800 Subject: [PATCH] Bael 5911 (#16299) * BAEL-7490 read write file in separate thread * Change the to try resources * Update the code to sync with article * get next val * get next val --- .../spring/data/jpa/getnextseq/MyEntity.java | 24 ++++++++++ .../jpa/getnextseq/MyEntityApplication.java | 13 +++++ .../jpa/getnextseq/MyEntityRepository.java | 12 +++++ .../data/jpa/getnextseq/MyEntityService.java | 22 +++++++++ .../MyEntityRepositoryIntegrationTest.java | 47 +++++++++++++++++++ .../src/test/resources/testsequence.sql | 3 ++ 6 files changed, 121 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntity.java create mode 100644 persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityApplication.java create mode 100644 persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepository.java create mode 100644 persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityService.java create mode 100644 persistence-modules/spring-data-jpa-query-4/src/test/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepositoryIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-query-4/src/test/resources/testsequence.sql diff --git a/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntity.java b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntity.java new file mode 100644 index 0000000000..4cd267162f --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntity.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.data.jpa.getnextseq; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; + +@Entity +public class MyEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeqGen") + @SequenceGenerator(name = "mySeqGen", sequenceName = "my_sequence_name", allocationSize = 1) + private Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityApplication.java b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityApplication.java new file mode 100644 index 0000000000..4b31ad768c --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.data.jpa.getnextseq; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MyEntityApplication { + + public static void main(String[] args) { + SpringApplication.run(MyEntityApplication.class); + } + +} diff --git a/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepository.java b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepository.java new file mode 100644 index 0000000000..c864c43fda --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.data.jpa.getnextseq; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface MyEntityRepository extends JpaRepository { + + @Query(value = "SELECT NEXTVAL('my_sequence_name')", nativeQuery = true) + Long getNextSequenceValue(); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityService.java b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityService.java new file mode 100644 index 0000000000..74825d2a82 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/main/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityService.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.data.jpa.getnextseq; + +import java.math.BigInteger; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Service; + +@Service +public class MyEntityService { + + @PersistenceContext + private EntityManager entityManager; + + public Long getNextSequenceValue(String sequenceName) { + BigInteger nextValue = (BigInteger) entityManager.createNativeQuery("SELECT NEXTVAL(:sequenceName)") + .setParameter("sequenceName", sequenceName) + .getSingleResult(); + return nextValue.longValue(); + } +} diff --git a/persistence-modules/spring-data-jpa-query-4/src/test/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-4/src/test/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepositoryIntegrationTest.java new file mode 100644 index 0000000000..3444bbbd49 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/test/java/com/baeldung/spring/data/jpa/getnextseq/MyEntityRepositoryIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.data.jpa.getnextseq; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +@SpringBootTest +@ActiveProfiles("test") +@Sql(scripts = "/testsequence.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) +public class MyEntityRepositoryIntegrationTest { + @Autowired + private MyEntityRepository myEntityRepository; + + @Autowired + private MyEntityService myEntityService; + + @Test + void whenUsingSequenceGenerator_thenNextValueReturned() { + MyEntity entity = new MyEntity(); + myEntityRepository.save(entity); + + long generatedId = entity.getId(); + assertNotNull(generatedId); + assertEquals(1L, generatedId); + } + + + @Test + void whenUsingCustomQuery_thenNextValueReturned() { + long generatedId = myEntityRepository.getNextSequenceValue(); + assertNotNull(generatedId); + assertEquals(1L, generatedId); + } + + @Test + void whenUsingEntityManager_thenNextValueReturned() { + long generatedId = myEntityService.getNextSequenceValue("my_sequence_name"); + assertNotNull(generatedId); + assertEquals(1L, generatedId); + } + +} diff --git a/persistence-modules/spring-data-jpa-query-4/src/test/resources/testsequence.sql b/persistence-modules/spring-data-jpa-query-4/src/test/resources/testsequence.sql new file mode 100644 index 0000000000..518353ad12 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-4/src/test/resources/testsequence.sql @@ -0,0 +1,3 @@ +DROP SEQUENCE IF EXISTS my_sequence_name; + +CREATE SEQUENCE my_sequence_name START 1; \ No newline at end of file