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 index 219b597262..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 @@ -125,4 +125,21 @@ - \ No newline at end of file + + EntityManager serializable persistence unit + com.baeldung.contextvsunit.entity.Product + true + + + + + + + + + + + + + + diff --git a/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceIntegrationTest.java b/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceIntegrationTest.java new file mode 100644 index 0000000000..d282f5e863 --- /dev/null +++ b/persistence-modules/hibernate-jpa-2/src/test/java/com/baeldung/contextvsunit/PersistenceContextVsUnitProductServiceIntegrationTest.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 PersistenceContextVsUnitProductServiceIntegrationTest { + + @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); + } +}