From 551df74b9c0d9a8338cc57b064f715c7af669601 Mon Sep 17 00:00:00 2001 From: Dragomir Alin Date: Fri, 29 Mar 2024 13:35:44 +0200 Subject: [PATCH] BAEL-6265: PersistenceUnit vs PersistenceContext --- persistence-modules/hibernate-jpa-2/pom.xml | 68 +++++++++++++++++++ .../PersistenceContextVsUnitApplication.java | 15 ++++ .../contextvsunit/entity/Product.java | 52 ++++++++++++++ .../PersistenceContextProductService.java | 38 +++++++++++ .../PersistenceUnitProductService.java | 28 ++++++++ .../main/resources/META-INF/persistence.xml | 22 ++++++ .../src/main/resources/logback.xml | 13 ++++ ...stenceContextVsUnitProductServiceTest.java | 57 ++++++++++++++++ .../src/test/resources/hibernate.properties | 17 +++++ persistence-modules/pom.xml | 1 + 10 files changed, 311 insertions(+) create mode 100644 persistence-modules/hibernate-jpa-2/pom.xml create mode 100644 persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/PersistenceContextVsUnitApplication.java create mode 100644 persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/entity/Product.java create mode 100644 persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceContextProductService.java create mode 100644 persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceUnitProductService.java create mode 100644 persistence-modules/hibernate-jpa-2/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate-jpa-2/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceTest.java create mode 100644 persistence-modules/hibernate-jpa-2/src/test/resources/hibernate.properties diff --git a/persistence-modules/hibernate-jpa-2/pom.xml b/persistence-modules/hibernate-jpa-2/pom.xml new file mode 100644 index 0000000000..d52317f29b --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + hibernate-jpa-2 + 0.0.1-SNAPSHOT + hibernate-jpa-2 + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate.orm + hibernate-core + ${hibernate.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + com.zaxxer + HikariCP + + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + + + com.h2database + h2 + ${h2.version} + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + + + + + 6.4.2.Final + 3.0.4 + 2.1.214 + 2.0.7 + 1.4.6 + + + diff --git a/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/PersistenceContextVsUnitApplication.java b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/PersistenceContextVsUnitApplication.java new file mode 100644 index 0000000000..4c44504d38 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/PersistenceContextVsUnitApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.contextvsunit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.contextvsunit") +public class PersistenceContextVsUnitApplication { + + public static void main(String[] args) { + SpringApplication.run(PersistenceContextVsUnitApplication.class, args); + } + +} diff --git a/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/entity/Product.java b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/entity/Product.java new file mode 100644 index 0000000000..088d70d437 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/entity/Product.java @@ -0,0 +1,52 @@ +package com.baeldung.contextvsunit.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "PRODUCT") +public class Product { + + @Id + private Long id; + + private String name; + + private double price; + + public Product() { + + } + + public Product(Long id, String name, double price) { + this.id = id; + this.name = name; + this.price = price; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + +} \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceContextProductService.java b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceContextProductService.java new file mode 100644 index 0000000000..b1fda2a9cb --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceContextProductService.java @@ -0,0 +1,38 @@ +package com.baeldung.contextvsunit.service; + +import org.springframework.stereotype.Service; + +import com.baeldung.contextvsunit.entity.Product; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.PersistenceContextType; +import jakarta.transaction.Transactional; + +@Service +public class PersistenceContextProductService { + + @PersistenceContext(type = PersistenceContextType.TRANSACTION) + private EntityManager entityManagerTransactionType; + + @PersistenceContext(type = PersistenceContextType.EXTENDED) + private EntityManager entityManagerExtendedType; + + @Transactional + public void insertProductWithTransactionTypePersistenceContext(Product product) { + entityManagerTransactionType.persist(product); + } + + public Product findWithTransactionTypePersistenceContext(long id) { + return entityManagerTransactionType.find(Product.class, id); + } + + public void insertProductWithExtendedTypePersistenceContext(Product product) { + entityManagerExtendedType.persist(product); + } + + public Product findWithExtendedTypePersistenceContext(long id) { + return entityManagerExtendedType.find(Product.class, id); + } + +} diff --git a/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceUnitProductService.java b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceUnitProductService.java new file mode 100644 index 0000000000..e3ea9eaa6b --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/java/com/baeldung/contextvsunit/service/PersistenceUnitProductService.java @@ -0,0 +1,28 @@ +package com.baeldung.contextvsunit.service; + +import org.springframework.stereotype.Service; + +import com.baeldung.contextvsunit.entity.Product; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceUnit; +import jakarta.transaction.Transactional; + +@Service +public class PersistenceUnitProductService { + + @PersistenceUnit(name = "com.baeldung.contextvsunit.h2_persistence_unit") + private EntityManagerFactory emf; + + @Transactional + public void insertProduct(Product product) { + EntityManager entityManager = emf.createEntityManager(); + entityManager.persist(product); + } + + public Product find(long id) { + EntityManager entityManager = emf.createEntityManager(); + return entityManager.find(Product.class, id); + } +} diff --git a/persistence-modules/hibernate-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-jpa-2/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..1f91014bd8 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,22 @@ + + + + EntityManager serializable persistence unit + com.baeldung.contextvsunit.entity.Product + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa-2/src/main/resources/logback.xml b/persistence-modules/hibernate-jpa-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceTest.java b/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceTest.java new file mode 100644 index 0000000000..bd724a6ae0 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceTest.java @@ -0,0 +1,57 @@ +package com.baeldung.contextvsunit; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.contextvsunit.entity.Product; +import com.baeldung.contextvsunit.service.PersistenceContextProductService; +import com.baeldung.contextvsunit.service.PersistenceUnitProductService; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = com.baeldung.contextvsunit.PersistenceContextVsUnitApplication.class) +public class PersistenceContextVsUnitProductServiceTest { + + @Autowired + private PersistenceContextProductService persistenceContextProductService; + @Autowired + private PersistenceUnitProductService persistenceUnitProductService; + + @Test + public void whenProductPersistWithTransactionPersistenceContext_thenShouldPersist() { + Product p = new Product(1L, "Product 1", 100.0); + persistenceContextProductService.insertProductWithTransactionTypePersistenceContext(p); + + Product productFromTransactionScoped = persistenceContextProductService.findWithTransactionTypePersistenceContext(1L); + Assertions.assertNotNull(productFromTransactionScoped); + + Product productFromExtendedScoped = persistenceContextProductService.findWithExtendedTypePersistenceContext(1L); + Assertions.assertNotNull(productFromExtendedScoped); + } + + @Test + public void whenProductPersistWithExtendedPersistence_thenShouldPersist() { + Product product = new Product(2L, "Product 1", 100.0); + persistenceContextProductService.insertProductWithExtendedTypePersistenceContext(product); + + Product productFromExtendedScoped = persistenceContextProductService.findWithExtendedTypePersistenceContext(2L); + Assertions.assertNotNull(productFromExtendedScoped); + + Product productFromTransactionScoped = persistenceContextProductService.findWithTransactionTypePersistenceContext(2L); + Assertions.assertNull(productFromTransactionScoped); + } + + @Test + public void whenProductPersistWithEntityManagerFactory_thenShouldPersist() { + Product p = new Product(1L, "Product 1", 100.0); + persistenceUnitProductService.insertProduct(p); + + Product createdProduct = persistenceUnitProductService.find(1L); + assertNotNull(createdProduct); + } +} diff --git a/persistence-modules/hibernate-jpa-2/src/test/resources/hibernate.properties b/persistence-modules/hibernate-jpa-2/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..20197700a1 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/test/resources/hibernate.properties @@ -0,0 +1,17 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect + +# enable to see Hibernate generated SQL +hibernate.show_sql=false + +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 188ea132c6..f717287f29 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -35,6 +35,7 @@ hibernate-exceptions hibernate-libraries hibernate-jpa + hibernate-jpa-2 hibernate-queries hibernate-enterprise influxdb