From 551df74b9c0d9a8338cc57b064f715c7af669601 Mon Sep 17 00:00:00 2001 From: Dragomir Alin Date: Fri, 29 Mar 2024 13:35:44 +0200 Subject: [PATCH 1/4] 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 From 1694ed90c4e4ab7860d81ce401f1390f2d75de07 Mon Sep 17 00:00:00 2001 From: Dragomir Alin Date: Mon, 1 Apr 2024 17:11:55 +0300 Subject: [PATCH 2/4] update test name --- ... PersistenceContextVsUnitProductServiceIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/{PersistenceContextVsUnitProductServiceTest.java => PersistenceContextVsUnitProductServiceIntegrationTest.java} (97%) 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/PersistenceContextVsUnitProductServiceIntegrationTest.java similarity index 97% rename from persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceTest.java rename to persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceIntegrationTest.java index bd724a6ae0..d282f5e863 100644 --- 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/PersistenceContextVsUnitProductServiceIntegrationTest.java @@ -15,7 +15,7 @@ import com.baeldung.contextvsunit.service.PersistenceUnitProductService; @RunWith(SpringRunner.class) @SpringBootTest(classes = com.baeldung.contextvsunit.PersistenceContextVsUnitApplication.class) -public class PersistenceContextVsUnitProductServiceTest { +public class PersistenceContextVsUnitProductServiceIntegrationTest { @Autowired private PersistenceContextProductService persistenceContextProductService; From 754fa52b6c9ab62390cf7dd581314aa2680131ac Mon Sep 17 00:00:00 2001 From: Dragomir Alin Date: Tue, 16 Apr 2024 09:30:38 +0300 Subject: [PATCH 3/4] update scope for test dependencies --- persistence-modules/hibernate-jpa-2/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/persistence-modules/hibernate-jpa-2/pom.xml b/persistence-modules/hibernate-jpa-2/pom.xml index d52317f29b..12d6691b1a 100644 --- a/persistence-modules/hibernate-jpa-2/pom.xml +++ b/persistence-modules/hibernate-jpa-2/pom.xml @@ -39,6 +39,7 @@ org.springframework.boot spring-boot-starter-test ${spring-boot.version} + test com.h2database @@ -54,6 +55,7 @@ org.hibernate hibernate-testing ${hibernate.version} + test From 8e38f00e63e5a40acd3a0ee484f5e69c84d3701c Mon Sep 17 00:00:00 2001 From: Dragomir Alin Date: Tue, 16 Apr 2024 18:40:20 +0300 Subject: [PATCH 4/4] update pom --- persistence-modules/hibernate-jpa-2/pom.xml | 31 ++++- .../main/resources/META-INF/persistence.xml | 125 +++++++++++++++++- 2 files changed, 152 insertions(+), 4 deletions(-) diff --git a/persistence-modules/hibernate-jpa-2/pom.xml b/persistence-modules/hibernate-jpa-2/pom.xml index 12d6691b1a..8bacdde59c 100644 --- a/persistence-modules/hibernate-jpa-2/pom.xml +++ b/persistence-modules/hibernate-jpa-2/pom.xml @@ -24,6 +24,11 @@ spring-boot-starter-web ${spring-boot.version} + + org.springframework.boot + spring-boot-starter-thymeleaf + ${spring-boot.version} + org.springframework.boot spring-boot-starter-data-jpa @@ -39,7 +44,6 @@ org.springframework.boot spring-boot-starter-test ${spring-boot.version} - test com.h2database @@ -51,20 +55,41 @@ hibernate-spatial ${hibernate.version} + + com.mysql + mysql-connector-j + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + org.hibernate hibernate-testing ${hibernate.version} - test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + org.postgresql + postgresql + ${postgresql.version} + 8.2.0 6.4.2.Final + 2.6.0 3.0.4 2.1.214 2.0.7 1.4.6 - + \ No newline at end of file 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 index 1f91014bd8..26535ee047 100644 --- 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 @@ -3,6 +3,128 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + + + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EntityManager serializable persistence unit + com.baeldung.hibernate.serializable.Email + com.baeldung.hibernate.serializable.Account + com.baeldung.hibernate.serializable.User + com.baeldung.hibernate.serializable.UserId + true + + + + + + + + + + + + + + + + + + EntityManager serializable persistence unit com.baeldung.contextvsunit.entity.Product @@ -18,5 +140,6 @@ + + - \ No newline at end of file