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