diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java index a92e90d2cb73..c4956afa5459 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java @@ -4,51 +4,51 @@ */ package org.hibernate.orm.test.jpa.criteria.alias; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; - -import java.util.List; - import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.Query; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.transform.Transformers; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Vlad Mihalcea */ -public class CriteriaMultiselectAliasTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Book.class - }; - } +@Jpa(annotatedClasses = {CriteriaMultiselectAliasTest.Book.class}) +public class CriteriaMultiselectAliasTest { - @Before - public void init() { - doInJPA( this::entityManagerFactory, entityManager -> { + @BeforeEach + public void init(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); book.id = 1; book.name = bookName(); - entityManager.persist( book ); } ); } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test @JiraKey(value = "HHH-13140") - public void testAlias() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testAlias(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Object[].class ); @@ -73,8 +73,8 @@ public void testAlias() { @Test @JiraKey(value = "HHH-13192") - public void testNoAliasInWhereClause() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNoAliasInWhereClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Object[].class ); @@ -101,8 +101,8 @@ public void testNoAliasInWhereClause() { @Test @JiraKey(value = "HHH-13192") - public void testNoAliasInWhereClauseSimplified() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNoAliasInWhereClauseSimplified(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = cb.createQuery(); Root root = criteriaQuery.from( Book.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java index ab3d30af98e0..9f46587f6cd1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java @@ -6,15 +6,16 @@ import java.math.BigDecimal; import java.math.BigInteger; -import jakarta.persistence.EntityManager; + import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Product; import org.hibernate.orm.test.jpa.metamodel.Product_; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -24,134 +25,117 @@ /** * @author Steve Ebersole */ -public class AggregationResultTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Product.class}) +public class AggregationResultTest { private CriteriaBuilder builder; @BeforeEach - public void createTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Product product = new Product(); - product.setId( "product1" ); - product.setPrice( 1.23d ); - product.setQuantity( 1000 ); - product.setPartNumber( ( (long) Integer.MAX_VALUE ) + 1 ); - product.setRating( 1.999f ); - product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) ); - product.setSomeBigDecimal( BigDecimal.valueOf( 987654.32 ) ); - em.persist( product ); - em.getTransaction().commit(); - em.close(); + public void createTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + Product product = new Product(); + product.setId( "product1" ); + product.setPrice( 1.23d ); + product.setQuantity( 1000 ); + product.setPartNumber( ((long) Integer.MAX_VALUE) + 1 ); + product.setRating( 1.999f ); + product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) ); + product.setSomeBigDecimal( BigDecimal.valueOf( 987654.32 ) ); + entityManager.persist( product ); + } ); } @AfterEach - public void cleanUpTestData() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Product" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanUpTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } /** * Sum of Longs should return a Long */ @Test - public void testSumOfLongs() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Long.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.partNumber ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Long.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfLongs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Long.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.partNumber ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Long.class, sumResult ); + } ); } /** - * Sum of Integers should return an Integer; note that this is distinctly different than JPAQL + * Sum of Integers should return an Integer; note that this is distinctly different from JPAQL */ @Test - public void testSumOfIntegers() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Integer.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.quantity ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Integer.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfIntegers(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Integer.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.quantity ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Integer.class, sumResult ); + } ); } /** * Sum of Doubles should return a Double */ @Test - public void testSumOfDoubles() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Double.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.price ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Double.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfDoubles(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Double.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.price ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Double.class, sumResult ); + } ); } /** - * Sum of Floats should return a Float; note that this is distinctly different than JPAQL + * Sum of Floats should return a Float; note that this is distinctly different from JPAQL */ @Test - public void testSumOfFloats() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Float.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.rating ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Float.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfFloats(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Float.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.rating ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Float.class, sumResult ); + } ); } /** * Sum of BigInteger should return a BigInteger */ @Test - public void testSumOfBigIntegers() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( BigInteger.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.someBigInteger ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( BigInteger.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfBigIntegers(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( BigInteger.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.someBigInteger ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( BigInteger.class, sumResult ); + } ); } /** * Sum of BigDecimal should return a BigDecimal */ @Test - public void testSumOfBigDecimals() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( BigDecimal.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.someBigDecimal ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( BigDecimal.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfBigDecimals(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( BigDecimal.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.someBigDecimal ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( BigDecimal.class, sumResult ); + } ); } - private void assertReturnType(Class expectedType, Object value) { + private void assertReturnType(Class expectedType, Object value) { if ( value != null && ! expectedType.isInstance( value ) ) { fail( "Result value was not of expected type: expected [" + expectedType.getName() diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java index b9d419e36c2f..697b24311c7a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java @@ -4,17 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.basic; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Date; -import java.util.List; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; - -import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -22,147 +11,149 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import jakarta.persistence.metamodel.SingularAttribute; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.time.Instant; +import java.util.Date; +import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * @author Steve Ebersole */ -public class BasicCriteriaUsageTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {Wall.class, Payment.class}) +public class BasicCriteriaUsageTest { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Wall.class, Payment.class }; + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testParameterCollection() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Wall.class ); - Root from = criteria.from( Wall.class ); - ParameterExpression param = em.getCriteriaBuilder().parameter( String.class ); - SingularAttribute colorAttribute = em.getMetamodel().entity( Wall.class ).getDeclaredSingularAttribute( "color" ); - assertNotNull( "metamodel returned null singular attribute", colorAttribute ); - Predicate predicate = em.getCriteriaBuilder().equal( from.get( colorAttribute ), param ); - criteria.where( predicate ); - assertEquals( 1, criteria.getParameters().size() ); - em.getTransaction().commit(); - em.close(); + public void testParameterCollection(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Wall.class ); + Root from = criteria.from( Wall.class ); + ParameterExpression param = entityManager.getCriteriaBuilder().parameter( String.class ); + SingularAttribute colorAttribute = entityManager.getMetamodel().entity( Wall.class ) + .getDeclaredSingularAttribute( "color" ); + assertNotNull( colorAttribute, "metamodel returned null singular attribute" ); + Predicate predicate = entityManager.getCriteriaBuilder().equal( from.get( colorAttribute ), param ); + criteria.where( predicate ); + assertEquals( 1, criteria.getParameters().size() ); + } ); } @Test - public void testTrivialCompilation() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Wall.class ); - criteria.from( Wall.class ); - em.createQuery( criteria ).getResultList(); - em.getTransaction().commit(); - em.close(); + public void testTrivialCompilation(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Wall.class ); + criteria.from( Wall.class ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-8283") - public void testDateCompositeCustomType() { + public void testDateCompositeCustomType(EntityManagerFactoryScope scope) { final Date date = Date.from( Instant.now() ); final Payment payment = new Payment(); payment.setAmount( new BigDecimal( 1000 ) ); payment.setDate( date ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( payment ); + scope.inTransaction( entityManager -> { + entityManager.persist( payment ); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Payment.class ); - Root rp = criteria.from( Payment.class ); - Predicate predicate = em.getCriteriaBuilder().equal( rp.get( Payment_.date ), date ); - criteria.where( predicate ); + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Payment.class ); + Root rp = criteria.from( Payment.class ); + Predicate predicate = entityManager.getCriteriaBuilder().equal( rp.get( Payment_.date ), date ); + criteria.where( predicate ); - TypedQuery q = em.createQuery( criteria ); - List payments = q.getResultList(); + TypedQuery q = entityManager.createQuery( criteria ); + List payments = q.getResultList(); - assertEquals( 1, payments.size() ); + assertEquals( 1, payments.size() ); - em.getTransaction().commit(); - em.close(); + } ); } @Test @JiraKey(value = "HHH-8373") - public void testFunctionCriteria() { + public void testFunctionCriteria(EntityManagerFactoryScope scope) { Wall wall = new Wall(); wall.setColor( "yellow" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( wall ); + scope.inTransaction( entityManager -> { + entityManager.persist( wall ); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery query = cb.createQuery( Wall.class ); - Root root = query.from( Wall.class ); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery( Wall.class ); + Root root = query.from( Wall.class ); - query.select( root ).where( cb.equal( root.get( "color" ), cb.lower( cb.literal( "YELLOW" ) ) ) ); + query.select( root ).where( cb.equal( root.get( "color" ), cb.lower( cb.literal( "YELLOW" ) ) ) ); - Wall resultItem = em.createQuery( query ).getSingleResult(); - assertNotNull( resultItem ); + Wall resultItem = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( resultItem ); - em.getTransaction().commit(); - em.close(); + } ); } @Test - @JiraKey( value = "HHH-8914" ) - public void testDoubleNegation() { + @JiraKey(value = "HHH-8914") + public void testDoubleNegation(EntityManagerFactoryScope scope) { Wall wall1 = new Wall(); wall1.setColor( "yellow" ); Wall wall2 = new Wall(); wall2.setColor( null ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( wall1 ); - em.persist( wall2 ); - em.getTransaction().commit(); - em.clear(); - - em.getTransaction().begin(); - - // Although the examples are simplified and the usages appear pointless, - // double negatives can occur in some dynamic applications (regardless - // if it results from bad design or not). Ensure we handle them as expected. - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery query = cb.createQuery( Wall.class ); - Root root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.isNotNull( root.get( "color" ) ) ) ); - Wall result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( null, result.getColor() ); - - query = cb.createQuery( Wall.class ); - root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.not( - cb.isNull( root.get( "color" ) ) ) ) ); - result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( null, result.getColor() ); - - query = cb.createQuery( Wall.class ); - root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.not( - cb.isNotNull( root.get( "color" ) ) ) ) ); - result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( "yellow", result.getColor() ); - - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + entityManager.persist( wall1 ); + entityManager.persist( wall2 ); + } ); + + scope.inTransaction( entityManager -> { + + // Although the examples are simplified and the usages appear pointless, + // double negatives can occur in some dynamic applications (regardless + // if it results from bad design or not). Ensure we handle them as expected. + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery( Wall.class ); + Root root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.isNotNull( root.get( "color" ) ) ) ); + Wall result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertNull( result.getColor() ); + + query = cb.createQuery( Wall.class ); + root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.not( + cb.isNull( root.get( "color" ) ) ) ) ); + result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertNull( result.getColor() ); + + query = cb.createQuery( Wall.class ); + root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.not( + cb.isNotNull( root.get( "color" ) ) ) ) ); + result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertEquals( "yellow", result.getColor() ); + + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java index 40e03396d68c..1c0c36cfda30 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java @@ -5,7 +5,6 @@ package org.hibernate.orm.test.jpa.criteria.basic; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -15,10 +14,11 @@ import java.io.Serializable; import java.util.List; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.hibernate.testing.orm.junit.JiraKey; @@ -29,39 +29,26 @@ * @author Andrea Boriero */ @JiraKey(value = "HHH-10843") -public class ConcatTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {TestEntity.class}; - } +@Jpa(annotatedClasses = {ConcatTest.TestEntity.class}) +public class ConcatTest { - @Before - public void setUp() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { TestEntity testEntity = new TestEntity(); testEntity.setName( "test_1" ); entityManager.persist( testEntity ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); + } + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testSelectCaseWithConcat() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + public void testSelectCaseWithConcat(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( Object[].class ); Root testEntity = query.from( TestEntity.class ); @@ -77,44 +64,22 @@ public void testSelectCaseWithConcat() { assertThat( results.size(), is( 1 ) ); assertThat( results.get( 0 )[0], is( "test_1" ) ); assertThat( results.get( 0 )[1], is( ".Test" ) ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); } @Test - public void testConcat() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + public void testConcat(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(); Root testEntity = query.from( TestEntity.class ); query.select( testEntity ).where( cb.equal( testEntity.get( "name" ), cb.concat( "test", cb.literal( "_1" ) ) ) ); - final List results = entityManager.createQuery( query ).getResultList(); - entityManager.getTransaction().commit(); + final List results = entityManager.createQuery( query ).getResultList(); assertThat( results.size(), is( 1 ) ); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java similarity index 97% rename from hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java index 90406f08ef91..8f4beb4663f2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java @@ -38,11 +38,11 @@ @Jpa(annotatedClasses = { Product.class, ShelfLife.class, - CiteriaAsExpressionTest.TestEntity.class + CriteriaAsExpressionTest.TestEntity.class }, useCollectingStatementInspector = true ) -public class CiteriaAsExpressionTest { +public class CriteriaAsExpressionTest { private static final int QUANTITY = 2; private static final String NAME = "a"; private static final Integer NAME_CONVERTED_VALUE = 1; @@ -98,7 +98,7 @@ public void testAsToString(EntityManagerFactoryScope scope) { @Test @JiraKey("HHH-15713") - public void testAsIntegerToIntegreDoesNotCreateACast(EntityManagerFactoryScope scope) { + public void testAsIntegerToIntegerDoesNotCreateACast(EntityManagerFactoryScope scope) { SQLStatementInspector statementInspector = (SQLStatementInspector) scope.getStatementInspector(); statementInspector.clear(); scope.inTransaction( @@ -175,8 +175,7 @@ private static String getExecutedQuery(SQLStatementInspector statementInspector) List sqlQueries = statementInspector.getSqlQueries(); assertThat( sqlQueries.size() ).isEqualTo( 1 ); - String executedQuery = sqlQueries.get( 0 ); - return executedQuery; + return sqlQueries.get( 0 ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java index 1c9b7d3cd5a5..74fe09fbefa5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java @@ -4,50 +4,50 @@ */ package org.hibernate.orm.test.jpa.criteria.basic; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; +import jakarta.persistence.Tuple; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.ParameterExpression; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import org.hibernate.Session; -import org.hibernate.SessionFactory; import org.hibernate.community.dialect.AltibaseDialect; -import org.hibernate.dialect.DB2Dialect; import org.hibernate.community.dialect.DerbyDialect; +import org.hibernate.community.dialect.GaussDBDialect; +import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Phone; import org.hibernate.orm.test.jpa.metamodel.Product; import org.hibernate.orm.test.jpa.metamodel.Product_; import org.hibernate.query.Query; +import org.hibernate.query.common.TemporalUnit; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaDerivedRoot; import org.hibernate.query.criteria.JpaSubQuery; -import org.hibernate.query.common.TemporalUnit; - -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.community.dialect.GaussDBDialect; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import jakarta.persistence.Tuple; -import jakarta.persistence.TypedQuery; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Expression; -import jakarta.persistence.criteria.ParameterExpression; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -55,16 +55,15 @@ * * @author Steve Ebersole */ -public class ExpressionsTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Product.class, Phone.class, Address.class}) +public class ExpressionsTest { private CriteriaBuilder builder; @BeforeEach - public void prepareTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); + public void prepareTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { Product product = new Product(); product.setId( "product1" ); product.setPrice( 1.23d ); @@ -79,15 +78,13 @@ public void prepareTestData() { } @AfterEach - public void cleanupTestData() { - entityManagerFactory().unwrap(SessionFactory.class).getSchemaManager().truncate(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmptyConjunction() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.and() ); @@ -99,17 +96,15 @@ public void testEmptyConjunction() { @Test @JiraKey( value = "HHH-15452") - public void testGetConjunctionExpressionsAndAddPredicate(){ - inTransaction( - entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + public void testGetConjunctionExpressionsAndAddPredicate(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Product.class); - Root rootClaseGrid = criteria.from(Product.class); + Root root = criteria.from(Product.class); - Predicate conjuncion = builder.conjunction(); - Predicate expr = builder.equal(rootClaseGrid.get("id"), "NON existing id"); + Predicate conjunction = builder.conjunction(); + Predicate expr = builder.equal(root.get("id"), "NON existing id"); // Modifications to the list do not affect the query - List> expressions = conjuncion.getExpressions(); + List> expressions = conjunction.getExpressions(); expressions.add( expr); List result = entityManager.createQuery( criteria ).getResultList(); @@ -120,10 +115,8 @@ public void testGetConjunctionExpressionsAndAddPredicate(){ @Test @JiraKey(value = "HHH-6876") - public void testEmptyInList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyInList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in() ); // empty IN list @@ -134,10 +127,8 @@ public void testEmptyInList() { } @Test - public void testEmptyConjunctionIsTrue() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunctionIsTrue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isTrue( builder.and() ) ); @@ -148,10 +139,8 @@ public void testEmptyConjunctionIsTrue() { } @Test - public void testEmptyConjunctionIsFalse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunctionIsFalse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isFalse( builder.and() ) ); @@ -162,10 +151,8 @@ public void testEmptyConjunctionIsFalse() { } @Test - public void testEmptyDisjunction() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.disjunction() ); @@ -176,10 +163,8 @@ public void testEmptyDisjunction() { } @Test - public void testEmptyDisjunctionIsTrue() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunctionIsTrue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isTrue( builder.disjunction() ) ); @@ -190,10 +175,8 @@ public void testEmptyDisjunctionIsTrue() { } @Test - public void testEmptyDisjunctionIsFalse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunctionIsFalse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isFalse( builder.disjunction() ) ); @@ -204,10 +187,8 @@ public void testEmptyDisjunctionIsFalse() { } @Test - public void testDiff() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testDiff(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Integer.class ); criteria.from( Product.class ); criteria.select( builder.diff( builder.literal( 5 ), builder.literal( 2 ) ) ); @@ -218,10 +199,8 @@ public void testDiff() { } @Test - public void testDiffWithQuotient() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testDiffWithQuotient(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -240,10 +219,8 @@ public void testDiffWithQuotient() { } @Test - public void testSumWithQuotient() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithQuotient(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -263,10 +240,8 @@ public void testSumWithQuotient() { @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17223" ) - public void testSumWithCoalesce() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithCoalesce(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaQuery criteria = builder.createQuery( Integer.class ); final Root root = criteria.from( Product.class ); criteria.select( @@ -282,10 +257,8 @@ public void testSumWithCoalesce() { @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17260" ) - public void testSumWithSubqueryPath() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithSubqueryPath(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = entityManager.unwrap( Session.class ).getCriteriaBuilder(); final JpaCriteriaQuery criteria = cb.createQuery( Integer.class ); final JpaSubQuery subquery = criteria.subquery( Tuple.class ); @@ -306,20 +279,16 @@ public void testSumWithSubqueryPath() { @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "does not support extract(epoch)") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "datediff overflow limits") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.date multi overflows") - public void testDateTimeOperations() { + public void testDateTimeOperations(EntityManagerFactoryScope scope) { HibernateCriteriaBuilder builder = (HibernateCriteriaBuilder) this.builder; - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDate.class); criteria.select( builder.addDuration( builder.localDate(), builder.duration(2, TemporalUnit.YEAR) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDate.class); criteria.select( builder.addDuration( // had to call literal() here because parameter-based binding caused error from @@ -339,34 +308,26 @@ public void testDateTimeOperations() { // entityManager.createQuery(criteria).getSingleResult(); // } // ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDateTime.class); criteria.select( builder.subtractDuration( builder.localDateTime(), Duration.ofMinutes(30) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationScaled( 5, builder.duration(2, TemporalUnit.HOUR ) ) ); assertEquals( Duration.ofHours(10), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationSum( builder.duration(30, TemporalUnit.MINUTE ), builder.duration(2, TemporalUnit.HOUR) ) ); assertEquals( Duration.ofMinutes(150), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Long.class); criteria.select( builder.durationByUnit( TemporalUnit.SECOND, builder.durationSum( builder.duration(30, TemporalUnit.MINUTE), @@ -379,20 +340,16 @@ public void testDateTimeOperations() { @Test @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "numeric overflows") @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "does not support extract(epoch)") - void testDurationBetween() { + void testDurationBetween(EntityManagerFactoryScope scope) { HibernateCriteriaBuilder builder = (HibernateCriteriaBuilder) this.builder; - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDate(), LocalDate.of(2000,1, 1) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDate(), builder.subtractDuration( builder.localDate(), @@ -400,9 +357,7 @@ void testDurationBetween() { assertEquals( Duration.ofDays(2), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDateTime(), builder.subtractDuration( builder.localDateTime(), @@ -418,10 +373,8 @@ void testDurationBetween() { "Fixing this would require a custom SqmToSqlAstConverter that creates a special JdbcParameter " + "that is always rendered as literal. Since numeric literal + parameter arithmetic is rare, we skip this for now.") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "Same reason as for Derby") - public void testQuotientAndMultiply() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testQuotientAndMultiply(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -452,16 +405,14 @@ public void testQuotientAndMultiply() { } @Test - public void testParameterReuse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { - CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Product.class ); + public void testParameterReuse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); - ParameterExpression param = entityManager.getCriteriaBuilder().parameter( String.class ); - Predicate predicate = entityManager.getCriteriaBuilder().equal( from.get( Product_.id ), param ); - Predicate predicate2 = entityManager.getCriteriaBuilder().equal( from.get( Product_.name ), param ); - criteria.where( entityManager.getCriteriaBuilder().or( predicate, predicate2 ) ); + ParameterExpression param = builder.parameter( String.class ); + Predicate predicate = builder.equal( from.get( Product_.id ), param ); + Predicate predicate2 = builder.equal( from.get( Product_.name ), param ); + criteria.where( builder.or( predicate, predicate2 ) ); assertEquals( 1, criteria.getParameters().size() ); TypedQuery query = entityManager.createQuery( criteria ); int hqlParamCount = countGeneratedParameters( query.unwrap( Query.class ) ); @@ -476,10 +427,8 @@ private int countGeneratedParameters(Query query) { } @Test - public void testInExplicitTupleList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExplicitTupleList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ) @@ -491,10 +440,8 @@ public void testInExplicitTupleList() { } @Test - public void testInExplicitTupleListVarargs() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExplicitTupleListVarargs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in( ( (long) Integer.MAX_VALUE ) + 1 ) ); @@ -505,10 +452,8 @@ public void testInExplicitTupleListVarargs() { } @Test - public void testInExpressionVarargs() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExpressionVarargs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in( from.get( Product_.partNumber ) ) ); @@ -519,10 +464,8 @@ public void testInExpressionVarargs() { } @Test - public void testJoinedElementCollectionValuesInTupleList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testJoinedElementCollectionValuesInTupleList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Phone.class ); Root from = criteria.from( Phone.class ); criteria.where( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java index 0635d455f083..b9daa44e4773 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java @@ -6,18 +6,18 @@ import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.ListJoin; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Address_; import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -29,64 +29,57 @@ * * @author Brett Meyer */ -public class ListIndexTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Phone.class, Address.class}) +public class ListIndexTest { @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Phone" ).executeUpdate(); - em.createQuery( "delete Address" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-8404") - public void testListIndex() { - EntityManager em = getOrCreateEntityManager(); - - em.getTransaction().begin(); - - Address address1 = new Address(); - address1.setId( "a1" ); - Phone phone1 = new Phone(); - phone1.setId( "p1" ); - phone1.setAddress( address1 ); - Phone phone2 = new Phone(); - phone2.setId( "p2" ); - - phone2.setAddress( address1 ); - address1.getPhones().add( phone1 ); - address1.getPhones().add( phone2 ); - - Address address2 = new Address(); - address2.setId( "a2" ); - Phone phone3 = new Phone(); - phone3.setId( "p3" ); - - phone3.setAddress( address2 ); - address2.getPhones().add( phone3 ); - - em.persist( phone1 ); - em.persist( phone2 ); - em.persist( phone3 ); - em.persist( address1 ); - em.persist( address2 ); - em.getTransaction().commit(); - em.clear(); - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery
criteria = cb.createQuery( Address.class ); - Root
addressRoot = criteria.from( Address.class ); - ListJoin phones = addressRoot.join( Address_.phones ); - criteria.where( cb.gt( phones.index(), 0 ) ); - List
results = em.createQuery( criteria ).getResultList(); - - assertNotNull( results ); - // Ensure that the "index(phones) > 0" condition was included on the inner join, meaning only address1 - // (> 1 phone) was returned. - assertEquals( 1, results.size() ); - assertEquals( address1.getId(), results.get( 0 ).getId() ); + public void testListIndex(EntityManagerFactoryScope scope) { + final Address address1 = new Address(); + scope.inTransaction( entityManager -> { + address1.setId( "a1" ); + Phone phone1 = new Phone(); + phone1.setId( "p1" ); + phone1.setAddress( address1 ); + Phone phone2 = new Phone(); + phone2.setId( "p2" ); + + phone2.setAddress( address1 ); + address1.getPhones().add( phone1 ); + address1.getPhones().add( phone2 ); + + Address address2 = new Address(); + address2.setId( "a2" ); + Phone phone3 = new Phone(); + phone3.setId( "p3" ); + + phone3.setAddress( address2 ); + address2.getPhones().add( phone3 ); + + entityManager.persist( phone1 ); + entityManager.persist( phone2 ); + entityManager.persist( phone3 ); + entityManager.persist( address1 ); + entityManager.persist( address2 ); + } ) ; + scope.inEntityManager( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery
criteria = cb.createQuery( Address.class ); + Root
addressRoot = criteria.from( Address.class ); + ListJoin phones = addressRoot.join( Address_.phones ); + criteria.where( cb.gt( phones.index(), 0 ) ); + List
results = entityManager.createQuery( criteria ).getResultList(); + + assertNotNull( results ); + // Ensure that the "index(phones) > 0" condition was included on the inner join, meaning only address1 + // (> 1 phone) was returned. + assertEquals( 1, results.size() ); + assertEquals( address1.getId(), results.get( 0 ).getId() ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java index 7417fbcd69e6..0bd3b46c4769 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java @@ -5,7 +5,6 @@ package org.hibernate.orm.test.jpa.criteria.basic; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Path; @@ -15,13 +14,24 @@ import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.OracleDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.CreditCard_; +import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; @@ -38,201 +48,181 @@ * @author Steve Ebersole * @author Hardy Ferentschik */ -public class PredicateTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class PredicateTest { private CriteriaBuilder builder; @BeforeEach - public void prepareTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Order( "order-1", 1.0d ) ); - em.persist( new Order( "order-2", 10.0d ) ); - em.persist( new Order( "order-3", new char[]{'r','u'} ) ); - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + entityManager.persist( new Order( "order-1", 1.0d ) ); + entityManager.persist( new Order( "order-2", 10.0d ) ); + entityManager.persist( new Order( "order-3", new char[] {'r', 'u'} ) ); + } ); } @AfterEach - public void cleanUp() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - em.createQuery( "delete from Order" ).executeUpdate(); - - em.getTransaction().commit(); - em.close(); + public void cleanUp(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmptyConjunction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - // yes this is a retarded case, but explicitly allowed in the JPA spec - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.isTrue( builder.conjunction() ) ); - em.createQuery( orderCriteria ).getResultList(); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyConjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + // yes this is a retarded case, but explicitly allowed in the JPA spec + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.isTrue( builder.conjunction() ) ); + entityManager.createQuery( orderCriteria ).getResultList(); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } @Test - public void testEmptyDisjunction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - // yes this is a retarded case, but explicitly allowed in the JPA spec - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.isFalse( builder.disjunction() ) ); - em.createQuery( orderCriteria ).getResultList(); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyDisjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + // yes this is a retarded case, but explicitly allowed in the JPA spec + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.isFalse( builder.disjunction() ) ); + entityManager.createQuery( orderCriteria ).getResultList(); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } /** * Check simple not. */ @Test - public void testSimpleNot() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - final Predicate p = builder.not( builder.equal( orderRoot.get( "id" ), "order-1" ) ); - assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 2, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testSimpleNot(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + final Predicate p = builder.not( builder.equal( orderRoot.get( "id" ), "order-1" ) ); + assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 2, orders.size() ); + } ); } /** * Check simple not. */ @Test - public void testSimpleNot2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - final Predicate p = builder.equal( orderRoot.get( "id" ), "order-1" ).not(); - assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 2, orders.size() ); - em.getTransaction().commit(); - em.close(); - + public void testSimpleNot2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + final Predicate p = builder.equal( orderRoot.get( "id" ), "order-1" ).not(); + assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 2, orders.size() ); + } ); } /** * Check complicated not. */ @Test - public void testComplicatedNotOr() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate compoundPredicate = builder.not( builder.or( p1, p2 ) ); - // negated OR should become an AND - assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 1, orders.size() ); - Order order = orders.get( 0 ); - assertEquals( "order-3", order.getId() ); - em.getTransaction().commit(); - em.close(); + public void testComplicatedNotOr(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate compoundPredicate = builder.not( builder.or( p1, p2 ) ); + // negated OR should become an AND + assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 1, orders.size() ); + Order order = orders.get( 0 ); + assertEquals( "order-3", order.getId() ); + } ); } /** * Check complicated not. */ @Test - public void testNotMultipleOr() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate p3 = builder.equal( orderRoot.get( "id" ), "order-3" ); - final Predicate compoundPredicate = builder.or( p1, p2, p3 ).not(); - // negated OR should become an AND - assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 0, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testNotMultipleOr(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate p3 = builder.equal( orderRoot.get( "id" ), "order-3" ); + final Predicate compoundPredicate = builder.or( p1, p2, p3 ).not(); + // negated OR should become an AND + assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 0, orders.size() ); + } ); } /** * Check complicated not. */ @Test - public void testComplicatedNotAnd() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate compoundPredicate = builder.and( p1, p2 ).not(); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testComplicatedNotAnd(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate compoundPredicate = builder.and( p1, p2 ).not(); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } /** * Check predicate for field which has simple char array type (char[]). */ @Test - public void testCharArray() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.equal( orderRoot.get( "domen" ), new char[]{'r','u'} ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 1, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testCharArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.equal( orderRoot.get( "domen" ), new char[] {'r', 'u'} ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 1, orders.size() ); + } ); } /** @@ -244,118 +234,106 @@ public void testCharArray() { reason = "Oracle12cDialect uses blob to store byte arrays and it's not possible to compare blobs with simple equality operators.") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Blobs are not allowed in this expression") - public void testByteArray() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.equal( orderRoot.get( "number" ), new byte[]{'1','2'} ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testByteArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.equal( orderRoot.get( "number" ), new byte[] {'1', '2'} ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-5803" ) @SkipForDialect( dialectClass = CockroachDialect.class, reason = "https://github.com/cockroachdb/cockroach/issues/41943") - public void testQuotientConversion() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - Long longValue = 999999999L; - Path doublePath = orderRoot.get( Order_.totalPrice ); - Path integerPath = orderRoot.get( Order_.customer ).get( Customer_.age ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.ge( - builder.quot( integerPath, doublePath ), - longValue - ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testQuotientConversion(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + Long longValue = 999999999L; + Path doublePath = orderRoot.get( Order_.totalPrice ); + Path integerPath = orderRoot.get( Order_.customer ).get( Customer_.age ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.ge( + builder.quot( integerPath, doublePath ), + longValue + ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test - public void testExplicitBuilderBooleanHandling() { + public void testExplicitBuilderBooleanHandling(EntityManagerFactoryScope scope) { // just checking syntax of the resulting query - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - // note : these may fail on various matrix db jobs depending on how the dialect handles booleans - { - CriteriaQuery criteriaQuery = builder.createQuery( CreditCard.class ); - Root root = criteriaQuery.from( CreditCard.class ); - criteriaQuery.where( builder.isFalse( root.get( CreditCard_.approved ) ) ); - em.createQuery( criteriaQuery ).getResultList(); - } - - { - CriteriaQuery criteriaQuery = builder.createQuery( Order.class ); - Root root = criteriaQuery.from( Order.class ); - criteriaQuery.where( builder.isFalse( root.get( Order_.creditCard ).get( CreditCard_.approved ) ) ); - em.createQuery( criteriaQuery ).getResultList(); - } - - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + + // note : these may fail on various matrix db jobs depending on how the dialect handles booleans + { + CriteriaQuery criteriaQuery = builder.createQuery( CreditCard.class ); + Root root = criteriaQuery.from( CreditCard.class ); + criteriaQuery.where( builder.isFalse( root.get( CreditCard_.approved ) ) ); + entityManager.createQuery( criteriaQuery ).getResultList(); + } + + { + CriteriaQuery criteriaQuery = builder.createQuery( Order.class ); + Root root = criteriaQuery.from( Order.class ); + criteriaQuery.where( builder.isFalse( root.get( Order_.creditCard ).get( CreditCard_.approved ) ) ); + entityManager.createQuery( criteriaQuery ).getResultList(); + } + + } ); } @Test @JiraKey( value = "HHH-8901" ) - public void testEmptyInPredicate() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("totalPrice") ) ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "totalPrice" ) ) ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-17804" ) - public void testEmptyInPredicate2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("id") ) ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "id" ) ) ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-17804" ) - public void testEmptyInPredicate3() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("id") ).not() ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertFalse( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate3(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "id" ) ).not() ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertFalse( orders.isEmpty() ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java index 55015f5dea7d..20027716c5c3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java @@ -100,7 +100,7 @@ public void testSizeExpressionForTheOneToManyPropertyOfAComponentHql(EntityManag scope.inTransaction( entityManager -> { final String hql = "from Employee e where size( e.projects.previousProjects ) = 2"; - final List resultsList = entityManager.createQuery( hql ).getResultList(); + final List resultsList = entityManager.createQuery( hql ).getResultList(); assertThat( resultsList.size(), is( 1 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java index 79743085eff3..1040d6e70acc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java @@ -6,19 +6,19 @@ import java.util.List; import java.util.Set; -import jakarta.persistence.EntityManager; + import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Mote that these are simply performing syntax checking (can the criteria query @@ -26,47 +26,37 @@ * * @author Steve Ebersole */ -public class EnumIsMemberTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {User.class}; - } +@Jpa(annotatedClasses = {User.class}) +public class EnumIsMemberTest { @Test @JiraKey(value = "HHH-9605") - public void testQueryEnumCollection() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - User user = new User(); - user.setId( 1l ); - user.getRoles().add( User.Role.Admin ); - em.persist( user ); - em.getTransaction().commit(); - em.getTransaction().begin(); - - CriteriaBuilder builder = em.getCriteriaBuilder(); - - CriteriaQuery query = builder.createQuery( User.class ); - Root root = query.from( User.class ); - - Expression> roles = root.get( User_.roles ); - - // Using the correct collection of enums and an enum parameter - query.where( builder.isMember( User.Role.Admin, roles ) ); - - TypedQuery typedQuery = em.createQuery( query ); - List users = typedQuery.getResultList(); - assertEquals( 1, users.size() ); - - em.getTransaction().commit(); - em.getTransaction().begin(); - // delete - em.remove( user ); - em.getTransaction().commit(); - + public void testQueryEnumCollection(EntityManagerFactoryScope scope) { + final User user = new User(); + scope.inTransaction( entityManager -> { + user.setId( 1L ); + user.getRoles().add( User.Role.Admin ); + entityManager.persist( user ); + } ); + + scope.inTransaction( entityManager -> { + + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( User.class ); + Root root = query.from( User.class ); + Expression> roles = root.get( User_.roles ); + // Using the correct collection of enums and an enum parameter + query.where( builder.isMember( User.Role.Admin, roles ) ); + TypedQuery typedQuery = entityManager.createQuery( query ); + + List users = typedQuery.getResultList(); + assertEquals( 1, users.size() ); + } ); + + scope.inTransaction( entityManager -> { + // delete + entityManager.remove( entityManager.find(User.class, 1L ) ); + } ); } - } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java index 872d1ec52428..40d19982466b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java @@ -4,13 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.fetchscroll; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; @@ -20,150 +13,125 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import org.hibernate.query.Query; import org.hibernate.ScrollableResults; import org.hibernate.dialect.HANADialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.junit.Test; -import org.hibernate.testing.SkipForDialect; +import org.hibernate.query.Query; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * @author Chris Cranford */ @JiraKey(value = "HHH-10062") -public class CriteriaToScrollableResultsFetchTest extends BaseEntityManagerFunctionalTestCase { - - @Override - public Class[] getAnnotatedClasses() { - return new Class[]{ - Customer.class, - Order.class, - OrderLine.class, - Product.class, - PurchaseOrg.class, - Facility.class, - Site.class - }; +@Jpa(annotatedClasses = { + Customer.class, + Order.class, + OrderLine.class, + Product.class, + PurchaseOrg.class, + Facility.class, + Site.class +}) +public class CriteriaToScrollableResultsFetchTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - @SkipForDialect(value = HANADialect.class, comment = "HANA only supports forward-only cursors") - public void testWithScroll() { + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors") + public void testWithScroll(EntityManagerFactoryScope scope) { // Creates data necessary for test - Long facilityId = populate(); + Long facilityId = populate(scope); // Controller iterates the data - for ( OrderLine line : getOrderLinesScrolled( facilityId ) ) { + for ( OrderLine line : getOrderLinesScrolled( scope, facilityId ) ) { // This should ~NOT~ fail with a LazilyLoadException assertNotNull( line.getProduct().getFacility().getSite().getName() ); } } @Test - public void testNoScroll() { + public void testNoScroll(EntityManagerFactoryScope scope) { // Creates data necessary for test. - Long facilityId = populate(); + Long facilityId = populate(scope); // Controller iterates the data - for ( OrderLine line : getOrderLinesJpaFetched( facilityId ) ) { + for ( OrderLine line : getOrderLinesJpaFetched( scope, facilityId ) ) { assertNotNull( line.getProduct().getFacility().getSite().getName() ); } } - private List getOrderLinesScrolled(Long facilityId) { - EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); + private List getOrderLinesScrolled(EntityManagerFactoryScope scope, Long facilityId) { + return scope.fromTransaction( entityManager -> { - Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, em ); - assertEquals( "Expected one purchase organization.", 1, purchaseOrgs.size() ); - System.out.println( purchaseOrgs ); + Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, entityManager ); + assertEquals( 1, purchaseOrgs.size(), "Expected one purchase organization." ); - TypedQuery query = getOrderLinesQuery( purchaseOrgs, em ); + TypedQuery query = getOrderLinesQuery( entityManager, purchaseOrgs ); - Query hibernateQuery = query.unwrap( Query.class ); + Query hibernateQuery = query.unwrap( Query.class ); hibernateQuery.setReadOnly( true ); hibernateQuery.setCacheable( false ); List lines = new ArrayList<>(); - try (ScrollableResults scrollableResults = hibernateQuery.scroll()) { + try (ScrollableResults scrollableResults = hibernateQuery.scroll()) { scrollableResults.last(); - int rows = scrollableResults.getRowNumber() + 1; scrollableResults.beforeFirst(); while ( scrollableResults.next() ) { lines.add( (OrderLine) scrollableResults.get() ); } } assertNotNull( lines ); - assertEquals( "Expected one order line", 1, lines.size() ); + assertEquals( 1, lines.size(), "Expected one order line" ); - em.getTransaction().commit(); return lines; - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + } ); } - private List getOrderLinesJpaFetched(Long facilityId) { - EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); + private List getOrderLinesJpaFetched(EntityManagerFactoryScope scope, Long facilityId) { + return scope.fromTransaction( entityManager -> { - Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, em ); - assertEquals( "Expected one purchase organization.", 1, purchaseOrgs.size() ); - System.out.println( purchaseOrgs ); + Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, entityManager ); + assertEquals( 1, purchaseOrgs.size(), "Expected one purchase organization." ); - TypedQuery query = getOrderLinesQuery( purchaseOrgs, em ); - List lines = query.getResultList(); - em.getTransaction().commit(); - return lines; - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + TypedQuery query = getOrderLinesQuery( entityManager, purchaseOrgs ); + return query.getResultList(); + } ); } private Set getPurchaseOrgsByFacilityId(Long facilityId, EntityManager em) { Set orgs = new HashSet<>(); - try { - for ( PurchaseOrg purchaseOrg : findAll( PurchaseOrg.class, em ) ) { - for ( Facility facility : purchaseOrg.getFacilities() ) { - if ( facility.getId().equals( facilityId ) ) { - orgs.add( purchaseOrg ); - break; - } + for ( PurchaseOrg purchaseOrg : findAll( PurchaseOrg.class, em ) ) { + for ( Facility facility : purchaseOrg.getFacilities() ) { + if ( facility.getId().equals( facilityId ) ) { + orgs.add( purchaseOrg ); + break; } } } - catch (Exception e) { - - } - finally { - return orgs; - } + return orgs; } - private List findAll(Class clazz, EntityManager em) { - return em.createQuery( "SELECT o FROM " + clazz.getSimpleName() + " o", clazz ).getResultList(); + private List findAll(Class clazz, EntityManager entityManager) { + return entityManager.createQuery( "SELECT o FROM " + clazz.getSimpleName() + " o", clazz ).getResultList(); } - private TypedQuery getOrderLinesQuery(Collection purchaseOrgs, EntityManager em) { - CriteriaBuilder cb = em.getCriteriaBuilder(); + private TypedQuery getOrderLinesQuery(EntityManager entityManager, Collection purchaseOrgs) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( OrderLine.class ); Root root = query.from( OrderLine.class ); Path idPath = root.get( OrderLine_.id ); @@ -183,61 +151,46 @@ private TypedQuery getOrderLinesQuery(Collection purchas query.select( root ).where( predicates.toArray( new Predicate[predicates.size()] ) ); - return em.createQuery( query ); + return entityManager.createQuery( query ); } - private Long populate() { - final EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); - + private Long populate(EntityManagerFactoryScope scope) { + return scope.fromTransaction( entityManager -> { Customer customer = new Customer(); customer.setName( "MGM" ); - em.persist( customer ); + entityManager.persist( customer ); Site site = new Site(); site.setName( "NEW YORK" ); site.setCustomer( customer ); - em.persist( site ); + entityManager.persist( site ); Facility facility = new Facility(); facility.setName( "ACME" ); facility.setSite( site ); facility.setCustomer( customer ); - em.persist( facility ); + entityManager.persist( facility ); PurchaseOrg purchaseOrg = new PurchaseOrg(); purchaseOrg.setName( "LOONEY TUNES" ); purchaseOrg.setCustomer( customer ); - purchaseOrg.setFacilities( Arrays.asList( facility ) ); - em.persist( purchaseOrg ); + purchaseOrg.setFacilities( List.of( facility ) ); + entityManager.persist( purchaseOrg ); Product product = new Product( facility, "0000 0001" ); - em.persist( product ); + entityManager.persist( product ); Order order = new Order( purchaseOrg, "12345" ); - OrderLine line1 = new OrderLine( order, 1L, product ); + OrderLine line1 = new OrderLine( order, 1L, product ); Set lines = new HashSet<>(); lines.add( line1 ); - order.setLines( lines ); - em.persist( order ); - - em.getTransaction().commit(); + entityManager.persist( order ); return facility.getId(); - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java index beb802ced063..592709e50fd4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java @@ -6,206 +6,167 @@ import java.util.ArrayList; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; - /** * @author Erich Heard */ -public class IdClassPredicateTest extends AbstractMetamodelSpecificTest { - - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Widget.class, - Tool.class - }; - } +@Jpa(annotatedClasses = {Widget.class, Tool.class}) +public class IdClassPredicateTest { @BeforeEach - public void prepareTestData() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - - Widget w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "NA" ); - w.setCost( 10.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "EU" ); - w.setCost( 12.50 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "ASIA" ); - w.setCost( 110.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "NA" ); - w.setCost( 14.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "EU" ); - w.setCost( 8.75 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "ASIA" ); - w.setCost( 86.22 ); - em.persist( w ); - - Tool t = new Tool(); - t.setName( "AAA" ); - t.setType( "NA" ); - t.setCost( 10.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "AAA" ); - t.setType( "EU" ); - t.setCost( 12.50 ); - em.persist( t ); - - t = new Tool(); - t.setName( "AAA" ); - t.setType( "ASIA" ); - t.setCost( 110.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "NA" ); - t.setCost( 14.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "EU" ); - t.setCost( 8.75 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "ASIA" ); - t.setCost( 86.22 ); - em.persist( t ); - - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Widget w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "NA" ); + w.setCost( 10.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "EU" ); + w.setCost( 12.50 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "ASIA" ); + w.setCost( 110.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "NA" ); + w.setCost( 14.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "EU" ); + w.setCost( 8.75 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "ASIA" ); + w.setCost( 86.22 ); + entityManager.persist( w ); + + Tool t = new Tool(); + t.setName( "AAA" ); + t.setType( "NA" ); + t.setCost( 10.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "AAA" ); + t.setType( "EU" ); + t.setCost( 12.50 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "AAA" ); + t.setType( "ASIA" ); + t.setCost( 110.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "NA" ); + t.setCost( 14.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "EU" ); + t.setCost( 8.75 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "ASIA" ); + t.setCost( 86.22 ); + entityManager.persist( t ); + + } ); } - @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Widget" ).executeUpdate(); - em.createQuery( "delete Tool" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testCountIdClassAttributes(){ - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Long.class); - Root path = cq.from(Widget.class); - Expression countSelection = cb.count(path); - cq.select(countSelection); - Long count = em.createQuery(cq).getSingleResult(); -// // Packaging arguments for use in query. -// List divisions = new ArrayList( ); -// divisions.add( "NA" ); -// divisions.add( "EU" ); -// -// // Building the query. -// CriteriaBuilder criteria = em.getCriteriaBuilder( ); -// CriteriaQuery query = criteria.createQuery( Widget.class ); -// Root root = query.from( Widget.class ); -// -// Predicate predicate = root.get( "division" ).in( divisions ); -// query.where( predicate ); -// -// // Retrieving query.; -// List widgets = em.createQuery( query ).getResultList( ); -// Assert.assertEquals( 4, widgets.size() ); - - em.getTransaction().commit(); - em.close(); + public void testCountIdClassAttributes(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery( Long.class ); + Root path = cq.from( Widget.class ); + Expression countSelection = cb.count( path ); + cq.select( countSelection ); + entityManager.createQuery( cq ).getSingleResult(); + } ); } @Test - public void testDeclaredIdClassAttributes( ) { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testDeclaredIdClassAttributes(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - // Packaging arguments for use in query. - List divisions = new ArrayList( ); - divisions.add( "NA" ); - divisions.add( "EU" ); + // Packaging arguments for use in query. + List divisions = new ArrayList<>(); + divisions.add( "NA" ); + divisions.add( "EU" ); - // Building the query. - CriteriaBuilder criteria = em.getCriteriaBuilder( ); - CriteriaQuery query = criteria.createQuery( Widget.class ); - Root root = query.from( Widget.class ); + // Building the query. + CriteriaBuilder criteria = entityManager.getCriteriaBuilder(); + CriteriaQuery query = criteria.createQuery( Widget.class ); + Root root = query.from( Widget.class ); - Predicate predicate = root.get( "division" ).in( divisions ); - query.where( predicate ); + Predicate predicate = root.get( "division" ).in( divisions ); + query.where( predicate ); - // Retrieving query.; - List widgets = em.createQuery( query ).getResultList( ); - Assertions.assertEquals( 4, widgets.size() ); + // Retrieving query.; + List widgets = entityManager.createQuery( query ).getResultList(); + Assertions.assertEquals( 4, widgets.size() ); - em.getTransaction().commit(); - em.close(); + } ); } @Test - public void testSupertypeIdClassAttributes( ) { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testSupertypeIdClassAttributes(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - // Packaging arguments for use in query. - List types = new ArrayList( ); - types.add( "NA" ); - types.add( "EU" ); + // Packaging arguments for use in query. + List types = new ArrayList<>(); + types.add( "NA" ); + types.add( "EU" ); - // Building the query. - CriteriaBuilder criteria = em.getCriteriaBuilder( ); - CriteriaQuery query = criteria.createQuery( Tool.class ); - Root root = query.from( Tool.class ); + // Building the query. + CriteriaBuilder criteria = entityManager.getCriteriaBuilder(); + CriteriaQuery query = criteria.createQuery( Tool.class ); + Root root = query.from( Tool.class ); - Predicate predicate = root.get( "type" ).in( types ); - query.where( predicate ); + Predicate predicate = root.get( "type" ).in( types ); + query.where( predicate ); - // Retrieving query. - List tools = em.createQuery( query ).getResultList( ); - Assertions.assertEquals( 4, tools.size() ); + // Retrieving query. + List tools = entityManager.createQuery( query ).getResultList(); + Assertions.assertEquals( 4, tools.size() ); - em.getTransaction().commit(); - em.close(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java index 854c19cce099..a732303fff2e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java @@ -4,138 +4,134 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; +import org.hibernate.orm.test.jpa.metamodel.Customer; +import org.hibernate.orm.test.jpa.metamodel.Entity1; +import org.hibernate.orm.test.jpa.metamodel.Entity2; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; import org.hibernate.orm.test.jpa.metamodel.Thing; import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; +import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.ExpectedException; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Michael Rudolf * @author James Gilbertson */ -public class AbstractPathImplTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Entity1.class, Entity2.class, Entity3.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class, Thing.class, ThingWithQuantity.class, + VersionedEntity.class +}) +public class AbstractPathImplTest { @BeforeEach - public void prepareTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - Thing thing = new Thing(); - thing.setId( "thing1" ); - thing.setName( "A Thing" ); - em.persist( thing ); - - thing = new Thing(); - thing.setId( "thing2" ); - thing.setName( "Another Thing" ); - em.persist( thing ); - - ThingWithQuantity thingWithQuantity = new ThingWithQuantity(); - thingWithQuantity.setId( "thingWithQuantity3" ); - thingWithQuantity.setName( "3 Things" ); - thingWithQuantity.setQuantity( 3 ); - em.persist( thingWithQuantity ); - - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Thing thing = new Thing(); + thing.setId( "thing1" ); + thing.setName( "A Thing" ); + entityManager.persist( thing ); + + thing = new Thing(); + thing.setId( "thing2" ); + thing.setName( "Another Thing" ); + entityManager.persist( thing ); + + ThingWithQuantity thingWithQuantity = new ThingWithQuantity(); + thingWithQuantity.setId( "thingWithQuantity3" ); + thingWithQuantity.setName( "3 Things" ); + thingWithQuantity.setQuantity( 3 ); + entityManager.persist( thingWithQuantity ); + + } ); } @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.remove( em.find( Thing.class, "thing1" ) ); - em.remove( em.find( Thing.class, "thing2" ) ); - em.remove( em.find( ThingWithQuantity.class, "thingWithQuantity3" ) ); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @ExpectedException(value = IllegalArgumentException.class) @Test - public void testGetNonExistingAttributeViaName() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testGetNonExistingAttributeViaName(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Order.class ); Root orderRoot = criteria.from( Order.class ); orderRoot.get( "nonExistingAttribute" ); - } - finally { - em.close(); - } + } ); } @Test - public void testIllegalDereference() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testIllegalDereference(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Order.class ); Root orderRoot = criteria.from( Order.class ); - Path simplePath = orderRoot.get( "totalPrice" ); + Path simplePath = orderRoot.get( "totalPrice" ); // this should cause an ISE... - try { - simplePath.get( "yabbadabbado" ); - fail( "Attempt to dereference basic path should throw IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - } - finally { - em.close(); - } + assertThrows( + IllegalStateException.class, + () -> simplePath.get( "yabbadabbadoo" ), + "Attempting to dereference a basic path should throw IllegalStateException" + ); + } ); } @Test - public void testTypeExpression() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testTypeExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Thing.class ); Root thingRoot = criteria.from( Thing.class ); criteria.select( thingRoot ); - assertEquals( 3, em.createQuery( criteria ).getResultList().size() ); + assertEquals( 3, entityManager.createQuery( criteria ).getResultList().size() ); criteria.where( criteriaBuilder.equal( thingRoot.type(), criteriaBuilder.literal( Thing.class ) ) ); - assertEquals( 2, em.createQuery( criteria ).getResultList().size() ); - } - finally { - em.close(); - } + assertEquals( 2, entityManager.createQuery( criteria ).getResultList().size() ); + } ); } @Test @JiraKey( value = "HHH-15433") - public void testTypeExpressionWithoutInheritance() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testTypeExpressionWithoutInheritance(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery
criteria = criteriaBuilder.createQuery( Address.class ); Root
addressRoot = criteria.from( Address.class ); criteria.select( addressRoot ); criteria.where( criteriaBuilder.equal( addressRoot.type(), criteriaBuilder.literal( Address.class ) ) ); - em.createQuery( criteria ).getResultList(); - } - finally { - em.close(); - } + entityManager.createQuery( criteria ).getResultList(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java index aee7f0ed9253..e8af428d47b4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java @@ -4,7 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Fetch; @@ -12,39 +11,41 @@ import jakarta.persistence.criteria.JoinType; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Entity1; import org.hibernate.orm.test.jpa.metamodel.Entity1_; import org.hibernate.orm.test.jpa.metamodel.Entity2; import org.hibernate.orm.test.jpa.metamodel.Entity2_; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; /** * @author Gail Badner */ -public class FetchAndJoinTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Entity1.class, Entity2.class, Entity3.class}) +public class FetchAndJoinTest { @Test - public void testImplicitJoinFromExplicitCollectionJoin() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testImplicitJoinFromExplicitCollectionJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - final CriteriaBuilder builder = em.getCriteriaBuilder(); - final CriteriaQuery criteria = builder.createQuery(Entity1.class); + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteria = builder.createQuery( Entity1.class ); - final Root root = criteria.from(Entity1.class); - final Join entity2Join = root.join( Entity1_.entity2, JoinType.INNER); // illegal with fetch join + final Root root = criteria.from( Entity1.class ); + final Join entity2Join = root.join( Entity1_.entity2, + JoinType.INNER ); // illegal with fetch join - final Fetch entity2Fetch = root.fetch(Entity1_.entity2, JoinType.INNER); // <=== REMOVE - entity2Fetch.fetch( Entity2_.entity3 ); // <=== REMOVE + final Fetch entity2Fetch = root.fetch( Entity1_.entity2, JoinType.INNER ); // <=== REMOVE + entity2Fetch.fetch( Entity2_.entity3 ); // <=== REMOVE - criteria.where(builder.equal(root.get(Entity1_.value), "test"), - builder.equal(entity2Join.get(Entity2_.value), "test")); // illegal with fetch join + criteria.where( builder.equal( root.get( Entity1_.value ), "test" ), + builder.equal( entity2Join.get( Entity2_.value ), "test" ) ); // illegal with fetch join - em.createQuery(criteria).getResultList(); + entityManager.createQuery( criteria ).getResultList(); - em.getTransaction().commit(); - em.close(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java index 1bd1f4a73f02..1d801ea47fdd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -13,52 +11,46 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Address_; import org.hibernate.orm.test.jpa.metamodel.Article; import org.hibernate.orm.test.jpa.metamodel.Article_; import org.hibernate.orm.test.jpa.metamodel.EntityWithMapEC; import org.hibernate.orm.test.jpa.metamodel.EntityWithMapEC_; +import org.hibernate.orm.test.jpa.metamodel.Phone; import org.hibernate.orm.test.jpa.metamodel.Translation; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaExpression; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; /** * @author Steve Ebersole */ -public class PluralAttributeExpressionsTest extends AbstractMetamodelSpecificTest { - @Override - public Class[] getAnnotatedClasses() { - List classes = new ArrayList<>(); - Collections.addAll( classes, super.getAnnotatedClasses() ); - classes.add( EntityWithMapEC.class ); - classes.add( Article.class ); - classes.add( Translation.class ); - - return classes.toArray( new Class[ classes.size() ] ); - } +@Jpa(annotatedClasses = { + Address.class, Phone.class, EntityWithMapEC.class, Article.class, Translation.class +}) +public class PluralAttributeExpressionsTest { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // IS [NOT] EMPTY @Test - public void testCollectionIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Address a where a.phones is empty" ).getResultList(); }); } @Test - public void testCollectionIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); @@ -73,16 +65,16 @@ public void testCollectionIsEmptyCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select m from EntityWithMapEC m where m.elements is empty" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery criteria = cb.createQuery( EntityWithMapEC.class ); @@ -97,16 +89,16 @@ public void testElementMapIsEmptyCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Article a where a.translations is empty" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -124,15 +116,15 @@ public void testEntityMapIsEmptyCriteria() { // SIZE @Test - public void testCollectionSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Address a where size(a.phones) > 1" ).getResultList(); }); } @Test - public void testCollectionSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); @@ -147,16 +139,16 @@ public void testCollectionSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select m from EntityWithMapEC m where size( m.elements ) > 1" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery criteria = cb.createQuery( EntityWithMapEC.class ); @@ -171,16 +163,16 @@ public void testElementMapSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Article a where size(a.translations) > 1" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -195,8 +187,8 @@ public void testEntityMapSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-19126") - public void testPluralMapPathJavaType() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testPluralMapPathJavaType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -209,8 +201,8 @@ public void testPluralMapPathJavaType() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-19126") - public void testPluralListPathJavaType() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testPluralListPathJavaType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java index ae8de0121013..c7a86c059617 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java @@ -4,128 +4,138 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import java.util.Set; - -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Subquery; - import org.hibernate.dialect.SybaseASEDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; + +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Entity1; +import org.hibernate.orm.test.jpa.metamodel.Entity2; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.orm.test.jpa.metamodel.Info; import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.LineItem_; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.orm.test.jpa.metamodel.Thing; +import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; +import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; + +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.Test; +import java.util.Set; + import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Steve Ebersole */ -public class CorrelatedSubqueryTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Entity1.class, Entity2.class, Entity3.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class, Thing.class, ThingWithQuantity.class, + VersionedEntity.class +}) +public class CorrelatedSubqueryTest { @Test - public void testBasicCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customer = criteria.from( Customer.class ); - criteria.select( customer ); - Subquery orderSubquery = criteria.subquery( Order.class ); - Root customerCorrelationRoot = orderSubquery.correlate( customer ); - Join customerOrderCorrelationJoin = customerCorrelationRoot.join( Customer_.orders ); - orderSubquery.select( customerOrderCorrelationJoin ); - criteria.where( builder.not( builder.exists( orderSubquery ) ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testBasicCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customer = criteria.from( Customer.class ); + criteria.select( customer ); + Subquery orderSubquery = criteria.subquery( Order.class ); + Root customerCorrelationRoot = orderSubquery.correlate( customer ); + Join customerOrderCorrelationJoin = customerCorrelationRoot.join( Customer_.orders ); + orderSubquery.select( customerOrderCorrelationJoin ); + criteria.where( builder.not( builder.exists( orderSubquery ) ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test - public void testRestrictedCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Order.class ); - Root orderRoot = criteria.from( Order.class ); - criteria.select( orderRoot ); - // create correlated subquery - Subquery customerSubquery = criteria.subquery( Customer.class ); - Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); - Join orderCustomerJoin = orderRootCorrelation.join( Order_.customer ); - customerSubquery.where( builder.like( orderCustomerJoin.get( Customer_.name ), "%Caruso" ) ) - .select( orderCustomerJoin ); - criteria.where( builder.exists( customerSubquery ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testRestrictedCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Order.class ); + Root orderRoot = criteria.from( Order.class ); + criteria.select( orderRoot ); + // create correlated subquery + Subquery customerSubquery = criteria.subquery( Customer.class ); + Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); + Join orderCustomerJoin = orderRootCorrelation.join( Order_.customer ); + customerSubquery.where( builder.like( orderCustomerJoin.get( Customer_.name ), "%Caruso" ) ) + .select( orderCustomerJoin ); + criteria.where( builder.exists( customerSubquery ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey("HHH-3032") @SkipForDialect(dialectClass= SybaseASEDialect.class, majorVersion = 15) - public void testCorrelationExplicitSelectionCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery customerCriteria = builder.createQuery( Customer.class ); - Root customer = customerCriteria.from( Customer.class ); - Join o = customer.join( Customer_.orders ); - Subquery sq = customerCriteria.subquery(Order.class); - Join sqo = sq.correlate(o); - Join sql = sqo.join(Order_.lineItems); - sq.where( builder.gt(sql.get( LineItem_.quantity), 3) ); - // use the correlation itself as the subquery selection (initially caused problems wrt aliases) - sq.select(sqo); - customerCriteria.select(customer).distinct(true); - customerCriteria.where(builder.exists(sq)); - em.createQuery( customerCriteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testCorrelationExplicitSelectionCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery customerCriteria = builder.createQuery( Customer.class ); + Root customer = customerCriteria.from( Customer.class ); + Join o = customer.join( Customer_.orders ); + Subquery sq = customerCriteria.subquery( Order.class ); + Join sqo = sq.correlate( o ); + Join sql = sqo.join( Order_.lineItems ); + sq.where( builder.gt( sql.get( LineItem_.quantity ), 3 ) ); + // use the correlation itself as the subquery selection (initially caused problems wrt aliases) + sq.select( sqo ); + customerCriteria.select( customer ).distinct( true ); + customerCriteria.where( builder.exists( sq ) ); + entityManager.createQuery( customerCriteria ).getResultList(); + } ); } @Test - public void testRestrictedCorrelationNoExplicitSelection() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Order.class ); - Root orderRoot = criteria.from( Order.class ); - criteria.select( orderRoot ); - // create correlated subquery - Subquery customerSubquery = criteria.subquery( Customer.class ); - Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); - Join orderCustomerJoin = orderRootCorrelation.join( "customer" ); - customerSubquery.where( builder.like( orderCustomerJoin.get( "name" ), "%Caruso" ) ); - criteria.where( builder.exists( customerSubquery ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testRestrictedCorrelationNoExplicitSelection(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Order.class ); + Root orderRoot = criteria.from( Order.class ); + criteria.select( orderRoot ); + // create correlated subquery + Subquery customerSubquery = criteria.subquery( Customer.class ); + Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); + Join orderCustomerJoin = orderRootCorrelation.join( "customer" ); + customerSubquery.where( builder.like( orderCustomerJoin.get( "name" ), "%Caruso" ) ); + criteria.where( builder.exists( customerSubquery ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-8556") - public void testCorrelatedJoinsFromSubquery() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); + public void testCorrelatedJoinsFromSubquery(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); CriteriaQuery cquery = builder.createQuery(Customer.class); Root customer = cquery.from(Customer.class); cquery.select(customer); @@ -135,11 +145,6 @@ public void testCorrelatedJoinsFromSubquery() { Set> cJoins = sq.getCorrelatedJoins(); // ensure the join is returned in #getCorrelatedJoins - assertEquals( cJoins.size(), 1); - } - - @Test - public void testVariousSubqueryJoinSemantics() { - // meant to assert semantics of #getJoins versus #getCorrelatedJoins + assertEquals( 1, cJoins.size() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java index f5dd73af696a..042b496da79b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java @@ -4,109 +4,115 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Subquery; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Steve Ebersole */ -public class UncorrelatedSubqueryTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class UncorrelatedSubqueryTest { @Test - public void testGetCorrelatedParentIllegalStateException() { + public void testGetCorrelatedParentIllegalStateException(EntityManagerFactoryScope scope) { // test that attempting to call getCorrelatedParent on a uncorrelated query/subquery // throws ISE - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - Join orderJoin = customerRoot.join( Customer_.orders ); - criteria.select( customerRoot ); - Subquery subCriteria = criteria.subquery( Double.class ); - Root subqueryOrderRoot = subCriteria.from( Order.class ); - subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); - criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); - - assertFalse( customerRoot.isCorrelated() ); - assertFalse( subqueryOrderRoot.isCorrelated() ); - - try { - customerRoot.getCorrelationParent(); - fail( "Should have resulted in IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - - try { - subqueryOrderRoot.getCorrelationParent(); - fail( "Should have resulted in IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - - em.getTransaction().commit(); - em.close(); + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + Join orderJoin = customerRoot.join( Customer_.orders ); + criteria.select( customerRoot ); + Subquery subCriteria = criteria.subquery( Double.class ); + Root subqueryOrderRoot = subCriteria.from( Order.class ); + subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); + criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); + + assertFalse( customerRoot.isCorrelated() ); + assertFalse( subqueryOrderRoot.isCorrelated() ); + + assertThrows( + IllegalStateException.class, + customerRoot::getCorrelationParent, + "Should have resulted in IllegalStateException" + ); + + assertThrows( + IllegalStateException.class, + subqueryOrderRoot::getCorrelationParent, + "Should have resulted in IllegalStateException" + ); + } ); } @Test - public void testEqualAll() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - Join orderJoin = customerRoot.join( Customer_.orders ); - criteria.select( customerRoot ); - Subquery subCriteria = criteria.subquery( Double.class ); - Root subqueryOrderRoot = subCriteria.from( Order.class ); - subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); - criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testEqualAll(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + Join orderJoin = customerRoot.join( Customer_.orders ); + criteria.select( customerRoot ); + Subquery subCriteria = criteria.subquery( Double.class ); + Root subqueryOrderRoot = subCriteria.from( Order.class ); + subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); + criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); + entityManager.createQuery( criteria ).getResultList(); + + } ); } @Test - public void testLessThan() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - - Subquery subCriteria = criteria.subquery( Double.class ); - Root subQueryCustomerRoot = subCriteria.from( Customer.class ); - subCriteria.select( builder.avg( subQueryCustomerRoot.get( Customer_.age ) ) ); - - criteria.where( - builder.lessThan( - customerRoot.get( Customer_.age ), - subCriteria.getSelection().as( Integer.class ) - ) - ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testLessThan(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + + Subquery subCriteria = criteria.subquery( Double.class ); + Root subQueryCustomerRoot = subCriteria.from( Customer.class ); + subCriteria.select( builder.avg( subQueryCustomerRoot.get( Customer_.age ) ) ); + + criteria.where( + builder.lessThan( + customerRoot.get( Customer_.age ), + subCriteria.getSelection().as( Integer.class ) + ) + ); + entityManager.createQuery( criteria ).getResultList(); + + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java index d4a1ac8f6659..9690765414d8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java @@ -6,7 +6,6 @@ import java.util.Date; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.Tuple; import jakarta.persistence.criteria.CompoundSelection; import jakarta.persistence.criteria.CriteriaBuilder; @@ -14,239 +13,207 @@ import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; +import org.hibernate.orm.test.jpa.metamodel.Order; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; /** * @author Emmanuel Bernard */ -public class TupleCriteriaTest extends AbstractMetamodelSpecificTest { - - @Test - public void testArray() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery q = cb.createQuery(Object[].class); - Root c = q.from(Customer.class); - q.select( cb.array( c.get(Customer_.name), c.get(Customer_.age) ) ); - List result = em.createQuery(q).getResultList(); - assertEquals( 1, result.size() ); - assertEquals( c1.getName(), result.get( 0 )[0] ); - assertEquals( c1.getAge(), result.get( 0 )[1] ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class TupleCriteriaTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testTuple() { - EntityManager em = entityManagerFactory().createEntityManager(); - - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "age" ); - criteria.multiselect( namePath, agePath ); - List results = em.createQuery( criteria ).getResultList(); - assertEquals( 1, results.size() ); - Object resultElement = results.get( 0 ); - assertTrue( Tuple.class.isInstance( resultElement ), "Check result 'row' as Tuple" ); - Tuple resultElementTuple = (Tuple) resultElement; - Object[] tupleArray = resultElementTuple.toArray(); - assertEquals( 2, tupleArray.length ); - assertEquals( tupleArray[0], resultElementTuple.get( 0 ) ); - assertEquals( resultElementTuple.get( namePath ), resultElementTuple.get( 0 ) ); - assertEquals( tupleArray[1], resultElementTuple.get( 1 ) ); - assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( 1 ) ); - assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( "age" ) ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testArray(EntityManagerFactoryScope scope) { + final Customer c1 = new Customer(); + scope.inTransaction( entityManager -> { + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + scope.inTransaction( entityManager -> { + final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery q = cb.createQuery( Object[].class ); + Root c = q.from( Customer.class ); + q.select( cb.array( c.get( Customer_.name ), c.get( Customer_.age ) ) ); + List result = entityManager.createQuery( q ).getResultList(); + assertEquals( 1, result.size() ); + assertEquals( c1.getName(), result.get( 0 )[0] ); + assertEquals( c1.getAge(), result.get( 0 )[1] ); + } ); } @Test - public void testIllegalArgumentExceptionBuildingTupleWithSameAliases() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - namePath.alias( "age" ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "age" ); - try { + public void testTuple(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "age" ); criteria.multiselect( namePath, agePath ); - fail( "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" ); - } - catch (IllegalArgumentException expected) { - } - em.getTransaction().commit(); - em.close(); + List results = entityManager.createQuery( criteria ).getResultList(); + assertEquals( 1, results.size() ); + Object resultElement = results.get( 0 ); + assertTrue( Tuple.class.isInstance( resultElement ), "Check result 'row' as Tuple" ); + Tuple resultElementTuple = (Tuple) resultElement; + Object[] tupleArray = resultElementTuple.toArray(); + assertEquals( 2, tupleArray.length ); + assertEquals( tupleArray[0], resultElementTuple.get( 0 ) ); + assertEquals( resultElementTuple.get( namePath ), resultElementTuple.get( 0 ) ); + assertEquals( tupleArray[1], resultElementTuple.get( 1 ) ); + assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( 1 ) ); + assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( "age" ) ); + } ); } @Test - public void testVariousTupleAccessMethods() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - namePath.alias( "NAME" ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "AGE" ); - criteria.multiselect( namePath, agePath ); - - List results = em.createQuery( criteria ).getResultList(); - Tuple tuple = results.get( 0 ); - assertNotNull( tuple ); - assertNotNull( tuple.get( "NAME" ) ); - assertNotNull( tuple.get( "NAME", String.class ) ); - try { - tuple.get( "NAME", Date.class ); - fail( "Accessing Customer#name tuple as Date should have thrown exception" ); - } - catch (IllegalArgumentException expected) { - } - - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testIllegalArgumentExceptionBuildingTupleWithSameAliases(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + namePath.alias( "age" ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "age" ); + assertThrows( + IllegalArgumentException.class, + () -> criteria.multiselect( namePath, agePath ), + "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" + ); + } ); } @Test - public void testIllegalArgumentExceptionBuildingSelectArrayWithSameAliases() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - Path agePath = customerRoot.get( Customer_.age ); - try { - CompoundSelection c = builder.array( namePath.alias( "SAME" ), agePath.alias( "SAME" ) ); - criteria.select( c ); - fail( "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" ); - } - catch (IllegalArgumentException expected) { - } - em.getTransaction().commit(); - em.close(); + public void testVariousTupleAccessMethods(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + namePath.alias( "NAME" ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "AGE" ); + criteria.multiselect( namePath, agePath ); + + List results = entityManager.createQuery( criteria ).getResultList(); + Tuple tuple = results.get( 0 ); + assertNotNull( tuple ); + assertNotNull( tuple.get( "NAME" ) ); + assertNotNull( tuple.get( "NAME", String.class ) ); + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( "NAME", Date.class ), + "Accessing Customer#name tuple as Date should have thrown exception" + ); + } ); } @Test - public void testInvalidTupleIndexAccess() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); + public void testIllegalArgumentExceptionBuildingSelectArrayWithSameAliases(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + Path agePath = customerRoot.get( Customer_.age ); + assertThrows( + IllegalArgumentException.class, + () -> { + CompoundSelection c = builder.array( namePath.alias( "SAME" ), agePath.alias( "SAME" ) ); + criteria.select( c ); + }, + "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" + ); + } ); + } + @Test + public void testInvalidTupleIndexAccess(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); // the actual assertion block - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - criteria.multiselect( customerRoot.get( Customer_.name ), customerRoot.get( Customer_.age ) ); - List results = em.createQuery( criteria ).getResultList(); - assertEquals( 1, results.size() ); - Tuple tuple = results.get( 0 ); - try { - tuple.get( 99 ); - fail( "99 is invalid index" ); - } - catch (IllegalArgumentException expected) { - } - - try { - tuple.get( 99, String.class ); - fail( "99 is invalid index" ); - } - catch (IllegalArgumentException expected) { - } - - tuple.get( 0, String.class ); - tuple.get( 1, Integer.class ); - - try { - tuple.get( 0, Date.class ); - fail( "Date is invalid type" ); - } - catch (IllegalArgumentException expected) { - } - - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + criteria.multiselect( customerRoot.get( Customer_.name ), customerRoot.get( Customer_.age ) ); + List results = entityManager.createQuery( criteria ).getResultList(); + assertEquals( 1, results.size() ); + Tuple tuple = results.get( 0 ); + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 99 ), + "99 is invalid index" + ); + + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 99, String.class ), + "99 is invalid index" + ); + + tuple.get( 0, String.class ); + tuple.get( 1, Integer.class ); + + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 0, Date.class ), + "Date is invalid type" + ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java index 6de1198452b4..e845c4c109ef 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java @@ -4,92 +4,85 @@ */ package org.hibernate.orm.test.jpa.criteria.tuple; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Root; + import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity_; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import static org.junit.jupiter.api.Assertions.assertEquals; - +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import jakarta.persistence.EntityManager; -import jakarta.persistence.Tuple; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Root; +import static org.junit.jupiter.api.Assertions.assertEquals; @JiraKey( value = "HHH-15454" ) -public class TupleQueryRetrievePrimitiveTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {ThingWithQuantity.class}) +public class TupleQueryRetrievePrimitiveTest { public static final int QUANTITY_OF_THING = 3; public static final String THING_WITH_QUANTITY_3_ID = "thingWithQuantity3"; - private EntityManager em; - @BeforeEach - public void createThingWithQuantity() { - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - ThingWithQuantity thing = new ThingWithQuantity(); - thing.setId( THING_WITH_QUANTITY_3_ID ); - thing.setName( "3 Things" ); - thing.setQuantity(QUANTITY_OF_THING); - em.persist( thing ); - - em.getTransaction().commit(); + public void createThingWithQuantity(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + ThingWithQuantity thing = new ThingWithQuantity(); + thing.setId( THING_WITH_QUANTITY_3_ID ); + thing.setName( "3 Things" ); + thing.setQuantity( QUANTITY_OF_THING ); + entityManager.persist( thing ); + } ); } @AfterEach - public void endEntityManager() { - em.getTransaction().begin(); - em.remove( em.find( ThingWithQuantity.class, THING_WITH_QUANTITY_3_ID ) ); - em.getTransaction().commit(); - em.close(); + public void endEntityManager(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testRetrieveTupleEntryWithPrimitiveType() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryWithPrimitiveType(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get(ThingWithQuantity_.quantity.getName(), int.class); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryWithMetadata() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryWithMetadata(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get( ThingWithQuantity_.quantity.getName(), ThingWithQuantity_.quantity.getJavaType()); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryFromIndex() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryFromIndex(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get(0, ThingWithQuantity_.quantity.getJavaType()); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryWithTupleElement() { - final CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testRetrieveTupleEntryWithTupleElement(EntityManagerFactoryScope scope) { + final CriteriaBuilder cb = scope.getEntityManagerFactory().getCriteriaBuilder(); final CriteriaQuery query = cb.createTupleQuery(); final Root thingWithQuantity = query.from( ThingWithQuantity.class); final Path tupleElement = thingWithQuantity.get( ThingWithQuantity_.quantity); query.multiselect(tupleElement.alias(ThingWithQuantity_.quantity.getName())); - Tuple result = em.createQuery(query).setMaxResults(1).getSingleResult(); + Tuple result = scope.fromEntityManager( entityManager -> entityManager.createQuery(query).setMaxResults(1).getSingleResult() ); final int quantity = result.get(tupleElement); assertEquals(QUANTITY_OF_THING, quantity); } - private Tuple queryTuple() { - final CriteriaBuilder cb = em.getCriteriaBuilder(); + private Tuple queryTuple(EntityManagerFactoryScope scope) { + final CriteriaBuilder cb = scope.getEntityManagerFactory().getCriteriaBuilder(); final CriteriaQuery query = cb.createTupleQuery(); final Root thingWithQuantity = query.from(ThingWithQuantity.class); query.multiselect(thingWithQuantity.get(ThingWithQuantity_.quantity).alias(ThingWithQuantity_.quantity.getName())); - return em.createQuery(query).setMaxResults(1).getSingleResult(); + return scope.fromEntityManager( entityManager -> entityManager.createQuery(query).setMaxResults(1).getSingleResult() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java index 55d263c9e7a4..2f6f658d0220 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java @@ -4,8 +4,8 @@ */ package org.hibernate.orm.test.jpa.query; -import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; -import static org.junit.Assert.assertEquals; +import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Date; import java.util.List; @@ -14,7 +14,6 @@ import jakarta.persistence.ColumnResult; import jakarta.persistence.ConstructorResult; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; import jakarta.persistence.NamedNativeQueries; import jakarta.persistence.NamedNativeQuery; @@ -25,16 +24,19 @@ import jakarta.persistence.TemporalType; import org.hibernate.dialect.OracleDialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.SkipForDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; /** * @author Steve Ebersole */ -@SkipForDialect(value = OracleDialect.class, jiraKey = "HHH-10323") -public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctionalTestCase { +@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "https://hibernate.atlassian.net/browse/HHH-10323") +@Jpa(annotatedClasses = {ConstructorResultNativeQueryTest.Person.class}) +public class ConstructorResultNativeQueryTest { @Entity( name = "Person" ) @SqlResultSetMappings( value = { @@ -136,85 +138,54 @@ public Person(Integer id, String name, String weight) { } } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Person.class }; + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } - @Test - public void testConstructorResultNativeQuery() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", new Date() ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNativeQuery( - "select p.id, p.p_name from person p order by p.p_name", - "person-id-and-name" - ).getResultList(); - assertEquals( 1, results.size() ); - assertTyping( Person.class, results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testConstructorResultNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", new Date() ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNativeQuery( + "select p.id, p.p_name from person p order by p.p_name", + "person-id-and-name" + ).getResultList(); + assertEquals( 1, results.size() ); + assertTyping( Person.class, results.get( 0 ) ); + } ); } @Test - public void testMultipleConstructorResultNativeQuery() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", new Date() ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "person-id-and-name2" ).getResultList(); - assertEquals( 1, results.size() ); - Object[] result = assertTyping( Object[].class, results.get( 0 ) ); - assertEquals( 2, result.length ); - assertTyping( Person.class, result[0] ); - assertTyping( Person.class, result[1] ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testMultipleConstructorResultNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", new Date() ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNamedQuery( "person-id-and-name2" ).getResultList(); + assertEquals( 1, results.size() ); + Object[] result = assertTyping( Object[].class, results.get( 0 ) ); + assertEquals( 2, result.length ); + assertTyping( Person.class, result[0] ); + assertTyping( Person.class, result[1] ); + } ); } @Test - public void testConstructorResultNativeQuerySpecifyingType() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", "85" ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "person-id-and-name-and-weight" ).getResultList(); - assertEquals( 1, results.size() ); - assertTyping( Person.class, results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testConstructorResultNativeQuerySpecifyingType(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", "85" ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNamedQuery( "person-id-and-name-and-weight" ).getResultList(); + assertEquals( 1, results.size() ); + assertTyping( Person.class, results.get( 0 ) ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java index 3d22487016d8..5cde6135946a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java @@ -15,37 +15,33 @@ import jakarta.persistence.TypedQuery; import org.assertj.core.api.InstanceOfAssertFactories; import org.hibernate.Session; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.NativeQuery; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Andrea Boriero */ @JiraKey(value = "HHH-11092") -public class NamedQueryTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {NamedQueryTest.Game.class}) +public class NamedQueryTest { private static final String[] GAME_TITLES = { "Halo", "Grand Theft Auto", "NetHack" }; - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Game.class }; - } - - @Before - public void setUp() + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { for ( String title : GAME_TITLES ) { Game game = new Game( title ); entityManager.persist( game ); @@ -53,17 +49,17 @@ public void setUp() } ); } - @After - public void tearDown() { - doInJPA( this::entityManagerFactory, entityManager -> { + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "delete from Game" ).executeUpdate(); } ); } @Test - public void testNamedQueriesOrdinalParametersAreOneBased() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueriesOrdinalParametersAreOneBased(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -73,8 +69,8 @@ public void testNamedQueriesOrdinalParametersAreOneBased() { } @Test - public void testNamedQueryOrdinalParametersConflict() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryOrdinalParametersConflict(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -92,8 +88,8 @@ public void testNamedQueryOrdinalParametersConflict() { } @Test - public void testNamedQueryOrdinalParametersConflict2() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryOrdinalParametersConflict2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -111,8 +107,8 @@ public void testNamedQueryOrdinalParametersConflict2() { } @Test - public void testNativeNamedQueriesOrdinalParametersAreOneBased() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersAreOneBased(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -122,8 +118,8 @@ public void testNativeNamedQueriesOrdinalParametersAreOneBased() { } @Test - public void testNativeNamedQueriesOrdinalParametersConflict() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersConflict(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -142,8 +138,8 @@ public void testNativeNamedQueriesOrdinalParametersConflict() { } @Test - public void testNativeNamedQueriesOrdinalParametersConflict2() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersConflict2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -163,8 +159,8 @@ public void testNativeNamedQueriesOrdinalParametersConflict2() { @Test @JiraKey(value = "HHH-12621") - public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query originalQuery = entityManager.createNativeQuery( "select g from Game g where title = ?1" ); entityManager.getEntityManagerFactory().addNamedQuery( "myQuery", originalQuery ); @@ -182,23 +178,23 @@ public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces() { @Test @JiraKey(value = "HHH-11413") - public void testNamedNativeQueryExceptionNoResultDefined() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedNativeQueryExceptionNoResultDefined(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { assertThrows( - "Named query exists but its result type is not compatible", IllegalArgumentException.class, - () -> entityManager.createNamedQuery( "NamedNativeQuery", Game.class ) + () -> entityManager.createNamedQuery( "NamedNativeQuery", Game.class ), + "Named query exists but its result type is not compatible" ); } ); } @Test @JiraKey(value = "HHH-11413") - public void testNamedQueryAddedFromTypedNativeQuery() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryAddedFromTypedNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.title from Game g where title = ?", String.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final TypedQuery namedQuery = entityManager.createNamedQuery( "the-query", String.class ); namedQuery.setParameter( 1, "abc" ); @@ -208,9 +204,9 @@ public void testNamedQueryAddedFromTypedNativeQuery() { @Test @JiraKey("HHH-17566") - public void testNamedQueryAddedFromEntityNativeQuery() { + public void testNamedQueryAddedFromEntityNativeQuery(EntityManagerFactoryScope scope) { // Check that the native query works - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); query.setParameter( 1, "Halo" ); @@ -221,10 +217,10 @@ public void testNamedQueryAddedFromEntityNativeQuery() { .returns( "Halo", Game::getTitle ); } ); // Check corresponding named query can be used as a typed query - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final TypedQuery namedQuery = entityManager.createNamedQuery( "the-query", Game.class ); namedQuery.setParameter( 1, "Halo" ); @@ -237,9 +233,9 @@ public void testNamedQueryAddedFromEntityNativeQuery() { @Test @JiraKey("HHH-17566") - public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped() { + public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped(EntityManagerFactoryScope scope) { // Check corresponding named query can be used as an untyped query - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); query.setParameter( 1, "Halo" ); @@ -250,10 +246,10 @@ public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped() { .returns( "Halo", Game::getTitle ); } ); // Check naming the native query works - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final Query namedQuery = entityManager.createNamedQuery( "the-query" ); namedQuery.setParameter( 1, "Halo" ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java index 5988526197e2..999af3715739 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java @@ -4,35 +4,26 @@ */ package org.hibernate.orm.test.jpa.query; -import java.math.BigDecimal; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.time.Month; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; import org.hibernate.Session; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.Nationalized; import org.hibernate.cfg.AvailableSettings; import org.hibernate.community.dialect.AltibaseDialect; +import org.hibernate.community.dialect.DerbyDialect; import org.hibernate.community.dialect.FirebirdDialect; -import org.hibernate.community.dialect.InformixDialect; import org.hibernate.community.dialect.GaussDBDialect; -import org.hibernate.dialect.HANADialect; +import org.hibernate.community.dialect.InformixDialect; +import org.hibernate.community.dialect.TiDBDialect; import org.hibernate.dialect.AbstractTransactSQLDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.community.dialect.DerbyDialect; -import org.hibernate.dialect.Dialect; import org.hibernate.dialect.H2Dialect; +import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MariaDBDialect; import org.hibernate.dialect.MySQLDialect; @@ -40,11 +31,13 @@ import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.community.dialect.TiDBDialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; -import org.hibernate.jpa.boot.spi.Bootstrap; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.Setting; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.type.AbstractSingleColumnStandardBasicType; import org.hibernate.type.descriptor.java.BigDecimalJavaType; import org.hibernate.type.descriptor.java.FloatJavaType; @@ -54,27 +47,22 @@ import org.hibernate.type.descriptor.jdbc.CharJdbcType; import org.hibernate.type.descriptor.jdbc.NumericJdbcType; import org.hibernate.type.descriptor.jdbc.RealJdbcType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.junit4.CustomRunner; -import org.hibernate.testing.orm.jpa.PersistenceUnitDescriptorAdapter; -import org.hibernate.testing.orm.junit.DialectContext; -import org.hibernate.testing.transaction.TransactionUtil; -import org.hibernate.testing.util.ServiceRegistryUtil; -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; +import java.math.BigDecimal; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Time; +import java.sql.Timestamp; +import java.sql.Types; +import java.time.Month; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.function.Function; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hibernate.Hibernate.getLobHelper; /** @@ -88,43 +76,58 @@ * so that we can more easily disable testing of a particular type in a particular dialect. */ @JiraKey(value = "HHH-7318") -@RunWith(CustomRunner.class) +@Jpa( + annotatedClasses = { + NativeQueryResultTypeAutoDiscoveryTest.BigDecimalAsDecimalType.class, + NativeQueryResultTypeAutoDiscoveryTest.BigintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BitEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BlobEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BooleanEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.Char255Entity.class, + NativeQueryResultTypeAutoDiscoveryTest.CharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.ClobEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DateEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DecimalEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DoubleEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.FloatEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.IntegerEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.LongvarbinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.LongvarcharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.NumericEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.NvarcharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.RealEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.SmallintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TimeEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TimestampEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TinyintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.VarbinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.VarcharEntity.class + }, + integrationSettings = {@Setting(name = AvailableSettings.NATIVE_PREFER_JDBC_DATETIME_TYPES, value = "true")} +) public class NativeQueryResultTypeAutoDiscoveryTest { - private static final Dialect DIALECT = DialectContext.getDialect(); - - private SessionFactoryImplementor entityManagerFactory; - - @After - public void cleanupEntityManagerFactory() { - if ( entityManagerFactory != null ) { - entityManagerFactory.close(); - entityManagerFactory = null; - } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle maps integer types to number") - public void smallintType() { - createEntityManagerFactory(SmallintEntity.class); - doTest( SmallintEntity.class, (short)32767 ); + public void smallintType(EntityManagerFactoryScope scope) { + doTest( scope, SmallintEntity.class, (short)32767 ); } @Test - public void integerTypes() { - createEntityManagerFactory( - BigintEntity.class, - IntegerEntity.class - ); - - doTest( BigintEntity.class, 9223372036854775807L ); - doTest( IntegerEntity.class, 2147483647 ); + public void integerTypes(EntityManagerFactoryScope scope) { + doTest( scope, BigintEntity.class, 9223372036854775807L ); + doTest( scope, IntegerEntity.class, 2147483647 ); } @Test - public void doubleType() { - createEntityManagerFactory( DoubleEntity.class ); - doTest( DoubleEntity.class, 445146115151.45845 ); + public void doubleType(EntityManagerFactoryScope scope) { + doTest( scope, DoubleEntity.class, 445146115151.45845 ); } @Test @@ -132,9 +135,8 @@ public void doubleType() { @SkipForDialect(dialectClass = OracleDialect.class, reason = "No support for the bit datatype so we use number(1,0)") @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, reason = "No support for the bit datatype so we use smallint") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "No support for the bit datatype so we use char(1)") - public void booleanType() { - createEntityManagerFactory( BooleanEntity.class ); - doTest( BooleanEntity.class, true ); + public void booleanType(EntityManagerFactoryScope scope) { + doTest( scope, BooleanEntity.class, true ); } @Test @@ -142,9 +144,8 @@ public void booleanType() { @SkipForDialect(dialectClass = OracleDialect.class, reason = "No support for the bit datatype so we use number(1,0)") @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, reason = "No support for the bit datatype so we use smallint") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "No support for the bit datatype so we use char(1)") - public void bitType() { - createEntityManagerFactory( BitEntity.class ); - doTest( BitEntity.class, false ); + public void bitType(EntityManagerFactoryScope scope) { + doTest( scope, BitEntity.class, false ); } @Test @@ -160,18 +161,16 @@ public void bitType() { @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps tinyint to smallint") @SkipForDialect(dialectClass = InformixDialect.class, reason = "informix maps tinyint to smallint") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.Turns tinyints into shorts in result sets and advertises the type as short in the metadata") - public void tinyintType() { - createEntityManagerFactory( TinyintEntity.class ); - doTest( TinyintEntity.class, (byte)127 ); + public void tinyintType(EntityManagerFactoryScope scope) { + doTest( scope, TinyintEntity.class, (byte)127 ); } @Test @SkipForDialect(dialectClass = H2Dialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = HSQLDialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") - public void floatType() { - createEntityManagerFactory( FloatEntity.class ); - doTest( FloatEntity.class, 15516.125f ); + public void floatType(EntityManagerFactoryScope scope) { + doTest( scope, FloatEntity.class, 15516.125f ); } @Test @@ -179,9 +178,8 @@ public void floatType() { @SkipForDialect(dialectClass = MariaDBDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = TiDBDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = HSQLDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") - public void realType() { - createEntityManagerFactory( RealEntity.class ); - doTest( RealEntity.class, 15516.125f ); + public void realType(EntityManagerFactoryScope scope) { + doTest( scope, RealEntity.class, 15516.125f ); } @Test @@ -193,11 +191,8 @@ public void realType() { @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") - public void numericType() { - createEntityManagerFactory( - NumericEntity.class - ); - doTest( NumericEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); + public void numericType(EntityManagerFactoryScope scope) { + doTest( scope, NumericEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); } @Test @@ -209,20 +204,14 @@ public void numericType() { @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") - public void decimalType() { - createEntityManagerFactory( DecimalEntity.class ); - doTest( DecimalEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); + public void decimalType(EntityManagerFactoryScope scope) { + doTest( scope, DecimalEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); } @Test - public void commonTextTypes() { - createEntityManagerFactory( - VarcharEntity.class, - NvarcharEntity.class - ); - - doTest( VarcharEntity.class, "some text" ); - doTest( NvarcharEntity.class, "some text" ); + public void commonTextTypes(EntityManagerFactoryScope scope) { + doTest( scope, VarcharEntity.class, "some text" ); + doTest( scope, NvarcharEntity.class, "some text" ); } @Test @@ -231,37 +220,26 @@ public void commonTextTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARCHAR to CLOB") - public void longCharType() { - createEntityManagerFactory( - LongvarcharEntity.class - ); - - doTest( LongvarcharEntity.class, "some text" ); + public void longCharType(EntityManagerFactoryScope scope) { + doTest( scope, LongvarcharEntity.class, "some text" ); } @Test - public void charType() { - createEntityManagerFactory( CharEntity.class ); - doTest( CharEntity.class, 'c' ); + public void charType(EntityManagerFactoryScope scope) { + doTest( scope, CharEntity.class, 'c' ); } @Test // Most other dialects define java.sql.Types.CHAR as "CHAR(1)" instead of "CHAR($l)", so they ignore the length @RequiresDialect(H2Dialect.class) - public void char255Type() { - createEntityManagerFactory( Char255Entity.class ); - doTest( Char255Entity.class, "some text" ); + public void char255Type(EntityManagerFactoryScope scope) { + doTest( scope, Char255Entity.class, "some text" ); } @Test - public void binaryTypes() { - createEntityManagerFactory( - BinaryEntity.class, - VarbinaryEntity.class - ); - - doTest( BinaryEntity.class, "some text".getBytes() ); - doTest( VarbinaryEntity.class, "some text".getBytes() ); + public void binaryTypes(EntityManagerFactoryScope scope) { + doTest( scope, BinaryEntity.class, "some text".getBytes() ); + doTest( scope, VarbinaryEntity.class, "some text".getBytes() ); } @Test @@ -270,29 +248,22 @@ public void binaryTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to BLOB") - public void longBinaryType() { - createEntityManagerFactory( - LongvarbinaryEntity.class - ); - - doTest( LongvarbinaryEntity.class, "some text".getBytes() ); + public void longBinaryType(EntityManagerFactoryScope scope) { + doTest( scope, LongvarbinaryEntity.class, "some text".getBytes() ); } @Test // Lobs are apparently handled differently in other dialects, queries return Strings instead of the CLOB/BLOB @RequiresDialect(H2Dialect.class) - public void lobTypes() { - createEntityManagerFactory( - ClobEntity.class, - BlobEntity.class - ); - + public void lobTypes(EntityManagerFactoryScope scope) { doTest( + scope, ClobEntity.class, Clob.class, session -> getLobHelper().createClob( "some text" ) ); doTest( + scope, BlobEntity.class, Blob.class, session -> getLobHelper().createBlob( "some text".getBytes() ) @@ -305,49 +276,39 @@ public void lobTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, reason = "Sybase maps DATE and TIME to TIMESTAMP", matchSubTypes = true) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps DATE and TIME to TIMESTAMP") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.GaussDB's Oracle model maps DATE and TIME to TIMESTAMP") - public void dateTimeTypes() { - createEntityManagerFactory( - DateEntity.class, - TimeEntity.class - ); - + public void dateTimeTypes(EntityManagerFactoryScope scope) { ZonedDateTime zonedDateTime = ZonedDateTime.of( 2014, Month.NOVEMBER.getValue(), 15, 18, 0, 0, 0, ZoneId.of( "UTC" ) ); - doTest( DateEntity.class, new java.sql.Date( zonedDateTime.toInstant().toEpochMilli() ) ); - doTest( TimeEntity.class, new Time( zonedDateTime.toLocalTime().toNanoOfDay() / 1000 ) ); + doTest( scope, DateEntity.class, new java.sql.Date( zonedDateTime.toInstant().toEpochMilli() ) ); + doTest( scope, TimeEntity.class, new Time( zonedDateTime.toLocalTime().toNanoOfDay() / 1000 ) ); } @Test - public void timestampType() { - createEntityManagerFactory( - TimestampEntity.class - ); - + public void timestampType(EntityManagerFactoryScope scope) { ZonedDateTime zonedDateTime = ZonedDateTime.of( 2014, Month.NOVEMBER.getValue(), 15, 18, 0, 0, 0, ZoneId.of( "UTC" ) ); - doTest( TimestampEntity.class, new Timestamp( zonedDateTime.toInstant().toEpochMilli() ) ); + doTest( scope, TimestampEntity.class, new Timestamp( zonedDateTime.toInstant().toEpochMilli() ) ); } - private , T> void doTest(Class entityType, T testedValue) { - this.doTest( entityType, ReflectHelper.getClass( testedValue ), ignored -> testedValue ); + private , T> void doTest(EntityManagerFactoryScope scope, Class entityType, T testedValue) { + this.doTest( scope, entityType, ReflectHelper.getClass( testedValue ), ignored -> testedValue ); } - private , T> void doTest(Class entityType, Class testedValueClass, - Function testedValueProvider) { - String entityName = entityManagerFactory.getMetamodel().entity( entityType ).getName(); + private , T> void doTest(EntityManagerFactoryScope scope, Class entityType, Class testedValueClass, + Function testedValueProvider) { // Expecting all entities to use the entity name as table name in these tests, because it's simpler - String tableName = entityName; + String tableName = scope.getEntityManagerFactory().getMetamodel().entity( entityType ).getName(); // Create a single record in the test database. - TransactionUtil.doInJPA( () -> entityManagerFactory, em -> { + scope.inTransaction( em -> { try { E entity = entityType.getConstructor().newInstance(); T testedValue = testedValueProvider.apply( em.unwrap( Session.class ) ); @@ -362,37 +323,16 @@ private , T> void doTest(Class entityType, Class entityManagerFactory, em -> { + scope.inTransaction( em -> { // Execute a native query to get the entity that was just created. Object result = em.createNativeQuery( "SELECT testedProperty FROM " + tableName - ) - .getSingleResult(); + ).getSingleResult(); - Assert.assertThat( result, instanceOf( testedValueClass ) ); + assertThat( result, instanceOf( testedValueClass ) ); } ); } - private void createEntityManagerFactory(Class ... entityTypes) { - cleanupEntityManagerFactory(); - EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder = - (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder( - new PersistenceUnitDescriptorAdapter(), - buildSettings( entityTypes ) - ); - entityManagerFactory = entityManagerFactoryBuilder.build().unwrap( SessionFactoryImplementor.class ); - } - - private Map buildSettings(Class ... entityTypes) { - Map settings = new HashMap<>(); - settings.put( AvailableSettings.NATIVE_PREFER_JDBC_DATETIME_TYPES, "true" ); - settings.put( AvailableSettings.HBM2DDL_AUTO, "create-drop" ); - settings.put( AvailableSettings.DIALECT, DIALECT.getClass().getName() ); - settings.put( AvailableSettings.LOADED_CLASSES, Arrays.asList( entityTypes ) ); - ServiceRegistryUtil.applySettings( settings ); - return settings; - } - @MappedSuperclass static abstract class TestedEntity { private Long id; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java index 7a1be52c6195..2aef63c60ec4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java @@ -8,37 +8,29 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * @author Vlad Mihalcea * @see JPA-31 */ @JiraKey(value = "JPA-31") -public class NullParameterQueryTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Event.class - }; - } +@Jpa(annotatedClasses = {NullParameterQueryTest.Event.class}) +public class NullParameterQueryTest { @Test - public void test() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void test(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Event event = new Event(); - entityManager.persist( event ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { Event event = entityManager.createQuery( "select e " + "from Event e " + diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java index 37e689046094..80932e0088fd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java @@ -4,73 +4,61 @@ */ package org.hibernate.orm.test.jpa.query; -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Map; -import java.util.Objects; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import org.hibernate.HibernateException; import org.hibernate.annotations.Type; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.usertype.UserType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; - -import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; /** * @author Andrea Boriero */ -public class QueryParametersValidationTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {TestEntity.class}; - } - - @Override - protected void addConfigOptions(Map options) { - options.put( AvailableSettings.JPA_LOAD_BY_ID_COMPLIANCE, "true" ); - } +@Jpa( + annotatedClasses = {QueryParametersValidationTest.TestEntity.class}, + integrationSettings = {@Setting(name = AvailableSettings.JPA_LOAD_BY_ID_COMPLIANCE, value = "true")} +) +public class QueryParametersValidationTest { @JiraKey(value = "HHH-11397") - @Test(expected = IllegalArgumentException.class) - public void setParameterWithWrongTypeShouldThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { - entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1 ); - } - finally { - entityManager.close(); - } + @Test + public void setParameterWithWrongTypeShouldThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + Assertions.assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1 ) + ); + } ); } @Test - public void setParameterWithCorrectTypeShouldNotThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { + public void setParameterWithCorrectTypeShouldNotThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1L ); - } - finally { - entityManager.close(); - } + } ); } @Test @JiraKey(value = "HHH-11971") - public void setPrimitiveParameterShouldNotThrowExceptions() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { + public void setPrimitiveParameterShouldNotThrowExceptions(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", true @@ -79,22 +67,18 @@ public void setPrimitiveParameterShouldNotThrowExceptions() { "active", Boolean.TRUE ); - } - finally { - entityManager.close(); - } + } ); } - @Test(expected = IllegalArgumentException.class) + @Test @JiraKey( value = "HHH-11971") - public void setWrongPrimitiveParameterShouldThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { - entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", 'c' ); - } - finally { - entityManager.close(); - } + public void setWrongPrimitiveParameterShouldThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + Assertions.assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", 'c' ) + ); + } ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java index 9e9b7decb9ef..05f8358037d2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java @@ -4,15 +4,8 @@ */ package org.hibernate.orm.test.jpa.query; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.Map; import jakarta.persistence.CacheRetrieveMode; import jakarta.persistence.CacheStoreMode; -import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; import jakarta.persistence.NonUniqueResultException; import jakarta.persistence.Parameter; @@ -21,40 +14,42 @@ import jakarta.persistence.TemporalType; import jakarta.persistence.Tuple; import jakarta.persistence.TypedQuery; - import org.hibernate.Hibernate; import org.hibernate.QueryException; -import org.hibernate.cfg.AvailableSettings; +import org.hibernate.SessionFactory; +import org.hibernate.community.dialect.DerbyDialect; +import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.community.dialect.DerbyDialect; -import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.orm.test.jpa.Distributor; import org.hibernate.orm.test.jpa.Item; import org.hibernate.orm.test.jpa.Wallet; import org.hibernate.stat.Statistics; - -import org.hibernate.testing.SkipForDialect; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; -import junit.framework.Assert; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; -import static junit.framework.Assert.assertNull; -import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard @@ -62,123 +57,84 @@ * @author Chris Cranford * @author Yanming Zhou */ -public class QueryTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { +@Jpa( + annotatedClasses = { Item.class, Distributor.class, Wallet.class, Employee.class, Contractor.class - }; - } - - @Override - @SuppressWarnings("unchecked") - protected void addConfigOptions(Map options) { - super.addConfigOptions( options ); - options.put( AvailableSettings.GENERATE_STATISTICS, "true" ); + }, + generateStatistics = true +) +public class QueryTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-7192") - public void testTypedManipulationQueryError() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - try { - em.createQuery( "delete Item", Item.class ); - fail(); - } - catch (IllegalArgumentException expected) { - //expected - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - } - - try { - em.createQuery( "update Item i set i.name = 'someName'", Item.class ); - fail(); - } - catch (IllegalArgumentException expected) { - //expected - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + public void testTypedManipulationQueryError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "delete Item", Item.class ) + ); + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "update Item i set i.name = 'someName'", Item.class ) + ); + } ); } @Test - public void testPagedQuery() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPagedQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); item = new Item( "Computer", "Apple II" ); - em.persist( item ); - Query q = em.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName" ); + entityManager.persist( item ); + Query q = entityManager.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName", Item.class ); q.setParameter( "itemName", "%" ); q.setMaxResults( 1 ); q.getSingleResult(); - q = em.createQuery( "select i from Item i where i.name like :itemName" ); + q = entityManager.createQuery( "select i from Item i where i.name like :itemName", Item.class ); q.setParameter( "itemName", "%" ); q.setFirstResult( 1 ); q.setMaxResults( 1 ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); q.setParameter( 1, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -190,41 +146,32 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameterParameterIncompatible() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameterParameterIncompatible(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -236,70 +183,53 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Long.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); q.setParameter( "iVal", null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -311,40 +241,32 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameterParameterIncompatible() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameterParameterIncompatible(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -356,84 +278,70 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Long.class; } }; q.setParameter( p, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=?" ); + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=?", Item.class ); q.setParameter( 1, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null and ? is null" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null and ? is null", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?", Item.class ); q.setParameter(1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10161") - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullPositionalParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullPositionalParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=?" ); - Parameter p = new Parameter() { + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=?", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -445,85 +353,70 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null and ? is null" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null and ? is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullNamedParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullNamedParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=:iVal" ); + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=:iVal", Item.class ); q.setParameter( "iVal", null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)" ); + q = entityManager.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10161") - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullNamedParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullNamedParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=:iVal" ); - Parameter p = new Parameter() { + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -535,199 +428,140 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getName() ); - List results = q.getResultList(); + List results = q.getResultList(); assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)" ); + q = entityManager.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - public void testQueryContainsQuotedSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + public void testQueryContainsQuotedSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); - Query q = em.createQuery( "from Item where name like '%;%'" ).setMaxResults(10); + TypedQuery q = entityManager.createQuery( "from Item where name like '%;%'", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createQuery( "from Item where name like '%;%' " ).setMaxResults(10); + q = entityManager.createQuery( "from Item where name like '%;%' ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - public void testNativeQueryContainsQuotedSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + public void testNativeQueryContainsQuotedSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - Query q = em.createNativeQuery( "select * from Item where name like '%;%'" ).setMaxResults(10); + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + + Query q = entityManager.createNativeQuery( "select * from Item where name like '%;%'", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createNativeQuery( "select * from Item where name like '%;%' " ).setMaxResults(10); + q = entityManager.createNativeQuery( "select * from Item where name like '%;%' ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - @SkipForDialect(value = OracleDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = SybaseDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = DerbyDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = DB2Dialect.class, comment = "Doesn't support semicolon as ending of statement") - public void testNativeQueryContainsQuotedSemicolonAndEndsWithSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); - - Query q = em.createNativeQuery( "select * from Item where name like '%;%';" ).setMaxResults(10); + @SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = DerbyDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = DB2Dialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + public void testNativeQueryContainsQuotedSemicolonAndEndsWithSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + + Query q = entityManager.createNativeQuery( "select * from Item where name like '%;%';", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createNativeQuery( "select * from Item where name like '%;%' ; " ).setMaxResults(10); + q = entityManager.createNativeQuery( "select * from Item where name like '%;%' ; ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testAggregationReturnType() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testAggregationReturnType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); item = new Item( "Computer", "Apple II" ); - em.persist( item ); - Query q = em.createQuery( "select count(i) from Item i where i.name like :itemName" ); + entityManager.persist( item ); + Query q = entityManager.createQuery( "select count(i) from Item i where i.name like :itemName" ); q.setParameter( "itemName", "%" ); - assertTrue( q.getSingleResult() instanceof Long ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertInstanceOf( Long.class, q.getSingleResult() ); + } ); } @Test - public void testTypeExpression() throws Exception { - final EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testTypeExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final Employee employee = new Employee( "Lukasz", 100.0 ); - em.persist( employee ); + entityManager.persist( employee ); final Contractor contractor = new Contractor( "Kinga", 100.0, "Microsoft" ); - em.persist( contractor ); - final Query q = em.createQuery( "SELECT e FROM Employee e where TYPE(e) <> Contractor" ); - final List result = q.getResultList(); + entityManager.persist( contractor ); + final TypedQuery q = entityManager.createQuery( "SELECT e FROM Employee e where TYPE(e) <> Contractor", Employee.class ); + final List result = q.getResultList(); assertNotNull( result ); - assertEquals( Arrays.asList( employee ), result ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertEquals( List.of( employee ), result ); + } ); } @Test @JiraKey(value = "HHH_7407") - public void testMultipleParameterLists() throws Exception { + public void testMultipleParameterLists(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - List names = Arrays.asList( item.getName() ); - Query q = em.createQuery( "select item from Item item where item.name in :names or item.name in :names2" ); + scope.inTransaction( entityManager -> { + List names = List.of( item.getName() ); + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in :names or item.name in :names2", Item.class ); q.setParameter( "names", names ); q.setParameter( "names2", names ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - List descrs = Arrays.asList( item.getDescr() ); - q = em.createQuery( - "select item from Item item where item.name in :names and ( item.descr is null or item.descr in :descrs )" ); + List descrs = List.of( item.getDescr() ); + q = entityManager.createQuery( + "select item from Item item where item.name in :names and ( item.descr is null or item.descr in :descrs )", + Item.class ); q.setParameter( "names", names ); q.setParameter( "descrs", descrs ); result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - - em.getTransaction().begin(); - em.remove( em.getReference( Item.class, item.getName() ) ); - em.remove( em.getReference( Item.class, item2.getName() ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @JiraKey(value = "HHH_8949") - public void testCacheStoreAndRetrieveModeParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "select item from Item item" ); + public void testCacheStoreAndRetrieveModeParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Query query = entityManager.createQuery( "select item from Item item", Item.class ); query.getHints().clear(); @@ -745,90 +579,67 @@ public void testCacheStoreAndRetrieveModeParameter() throws Exception { assertEquals( CacheRetrieveMode.USE, query.getHints().get( "jakarta.persistence.cache.retrieveMode" ) ); assertEquals( CacheStoreMode.REFRESH, query.getHints().get( "jakarta.persistence.cache.storeMode" ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testJpaPositionalParameters() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "from Item item where item.name =?1 or item.descr = ?1" ); - Parameter p1 = query.getParameter( 1 ); - Assert.assertNotNull( p1 ); - Assert.assertNotNull( p1.getPosition() ); - Assert.assertNull( p1.getName() ); - - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + public void testJpaPositionalParameters(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Query query = entityManager.createQuery( "from Item item where item.name =?1 or item.descr = ?1", Item.class ); + Parameter p1 = query.getParameter( 1 ); + assertNotNull( p1 ); + assertNotNull( p1.getPosition() ); + assertNull( p1.getName() ); + + } ); } @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionAndPositional() { + public void testParameterCollectionAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( "select item from Item item where item.name in ?1 and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in ?1 and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); - } @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionParenthesesAndPositional() { + public void testParameterCollectionParenthesesAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( - "select item from Item item where item.name in (?1) and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in (?1) and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); @@ -836,55 +647,53 @@ public void testParameterCollectionParenthesesAndPositional() { @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionSingletonParenthesesAndPositional() { + public void testParameterCollectionSingletonParenthesesAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( - "select item from Item item where item.name in (?1) and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in (?1) and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); } @Test - public void testParameterList() throws Exception { + public void testParameterList(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.name in :names" ); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - List params = new ArrayList(); + List params = new ArrayList<>(); params.add( item.getName() ); q.setParameter( "names", params ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - q = em.createQuery( "select item from Item item where item.name in :names" ); + q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); @@ -894,8 +703,8 @@ public void testParameterList() throws Exception { assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ?1" ); - params = new ArrayList(); + q = entityManager.createQuery( "select item from Item item where item.name in ?1", Item.class ); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); // deprecated usage of positional parameter by String @@ -903,52 +712,38 @@ public void testParameterList() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testParameterListInExistingParens() throws Exception { + public void testParameterListInExistingParens(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.name in (:names)" ); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in (:names)", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - List params = new ArrayList(); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( "names", params ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ( \n :names \n)\n" ); + q = entityManager.createQuery( "select item from Item item where item.name in ( \n :names \n)\n", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - params = new ArrayList(); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( "names", params ); @@ -956,8 +751,8 @@ public void testParameterListInExistingParens() throws Exception { assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ( ?1 )" ); - params = new ArrayList(); + q = entityManager.createQuery( "select item from Item item where item.name in ( ?1 )", Item.class ); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); // deprecated usage of positional parameter by String @@ -965,37 +760,23 @@ public void testParameterListInExistingParens() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17490" ) - public void testEmptyParameterList() throws Exception { + public void testEmptyParameterList(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); @@ -1004,7 +785,7 @@ public void testEmptyParameterList() throws Exception { assertNotNull( result ); assertEquals( 0, result.size() ); - q = em.createQuery( + q = entityManager.createQuery( "select item from Item item where item.name not in :names", Item.class ); @@ -1012,401 +793,263 @@ public void testEmptyParameterList() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testEscapeCharacter() throws Exception { + public void testEscapeCharacter(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro_oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' " ); - List result = q.getResultList(); + scope.inTransaction( entityManager -> { + + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' ", Item.class ); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - int deleted = em.createQuery( "delete from Item" ).executeUpdate(); + int deleted = entityManager.createQuery( "delete from Item" ).executeUpdate(); assertEquals( 2, deleted ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testNativeQueryByEntity() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); + public void testNativeQueryByEntity(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inEntityManager( entityManager -> { + + entityManager.getTransaction().begin(); + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + entityManager.getTransaction().commit(); - Statistics stats = em.getEntityManagerFactory().unwrap( SessionFactoryImplementor.class ).getStatistics(); stats.clear(); assertEquals( 0, stats.getFlushCount() ); - em.getTransaction().begin(); - item = (Item) em.createNativeQuery( "select * from Item", Item.class ).getSingleResult(); + entityManager.getTransaction().begin(); + item = (Item) entityManager.createNativeQuery( "select * from Item", Item.class ).getSingleResult(); assertEquals( 1, stats.getFlushCount() ); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + entityManager.getTransaction().commit(); + } ); } @Test - public void testNativeQueryByResultSet() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = (Item) em.createNativeQuery( + public void testNativeQueryByResultSet(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Item item = (Item) entityManager.createNativeQuery( "select name as itemname, descr as itemdescription from Item", "getItem" - ) - .getSingleResult(); + ).getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testExplicitPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testExplicitPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); - em.getTransaction().begin(); - Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in ?1" ); - List brands = new ArrayList(); + entityManager.persist( w ); + } ); + + scope.inTransaction( entityManager -> { + TypedQuery query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in ?1", Wallet.class ); + List brands = new ArrayList<>(); brands.add( "Lacoste" ); query.setParameter( 1, brands ); - w = (Wallet) query.getSingleResult(); + Wallet w = query.getSingleResult(); assertNotNull( w ); - query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1" ); + query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1", Wallet.class ); query.setParameter( 1, new Date(), TemporalType.DATE ); - //assertNull( query.getSingleResult() ); assertEquals( 0, query.getResultList().size() ); - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testTemporalTypeBinding() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = :me" ); - Parameter parameter = query.getParameter( "me", Date.class ); - assertEquals( parameter.getParameterType(), java.sql.Timestamp.class ); + public void testTemporalTypeBinding(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + TypedQuery query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = :me", Wallet.class ); + Parameter parameter = query.getParameter( "me", Date.class ); + assertEquals( java.sql.Timestamp.class, parameter.getParameterType() ); query.setParameter( "me", new Date() ); query.setParameter( "me", new Date(), TemporalType.DATE ); query.setParameter( "me", new GregorianCalendar(), TemporalType.DATE ); - - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } - + } ); } @Test - public void testPositionalParameterForms() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPositionalParameterForms(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); + entityManager.persist( w ); + } ); - em.getTransaction().begin(); + scope.inTransaction( entityManager -> { // first using jpa-style positional parameter - Query query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + TypedQuery query = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + Wallet w = query.getSingleResult(); assertNotNull( w ); // next using jpa-style positional parameter, but as a name (which is how Hibernate core treats these - query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + query = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); // deprecated usage of positional parameter by String query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + w = query.getSingleResult(); assertNotNull( w ); - - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testPositionalParameterWithUserError() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPositionalParameterWithUserError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.flush(); + entityManager.persist( w ); + entityManager.flush(); // Gaps are not allowed - try { - Query jpaQuery = em.createQuery( "select w from Wallet w where w.brand = ?1 and w.model = ?3" ); - fail( "expecting error regarding gap in positional param labels" ); - } - catch ( IllegalArgumentException e ) { - assertNotNull( e.getCause() ); - assertTyping( QueryException.class, e.getCause() ); - assertTrue( e.getCause().getMessage().contains( "Gap" ) ); - } + IllegalArgumentException iae = assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select w from Wallet w where w.brand = ?1 and w.model = ?3", Wallet.class ), + "expecting error regarding gap in positional param labels" + ); + assertNotNull( iae.getCause() ); + assertTyping( QueryException.class, iae.getCause() ); + assertTrue( iae.getCause().getMessage().contains( "Gap" ) ); // using jpa-style, position index should match syntax '?'. - Query jpaQuery = em.createQuery( "select w from Wallet w where w.brand = ?1" ); - jpaQuery.setParameter( 1, "Lacoste" ); - try { - jpaQuery.setParameter( 2, "Expensive" ); - fail( "Should fail due to a user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); + jpaQuery.setParameter( 1, "Lacoste" ); + jpaQuery.setParameter( 2, "Expensive" ); + }, + "Should fail due to a user error in parameters" + ); // using jpa-style, position index specified not in query - test exception type - jpaQuery = em.createQuery( "select w from Wallet w " ); - try { - Parameter parameter = jpaQuery.getParameter( 1 ); - fail( "Should fail due to a user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w " ); + jpaQuery.getParameter( 1 ); + }, + "Should fail due to a user error in parameters" + ); // using jpa-style, position index specified not in query - test exception type - jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( 1, Integer.class ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w" ); + jpaQuery.getParameter( 1, Integer.class ); + }, + "Should fail due to a user error in parameters" + ); + } ); } @Test @JiraKey(value = "HHH-10803") - public void testNamedParameterWithUserError() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNamedParameterWithUserError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.flush(); - - Query jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( "brand" ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - - jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( "brand", String.class ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + entityManager.persist( w ); + entityManager.flush(); + + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w", Wallet.class ); + jpaQuery.getParameter( "brand" ); + }, + "Should fail due to a user error in parameters" + ); + + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w", Wallet.class ); + jpaQuery.getParameter( "brand", String.class ); + }, + "Should fail due to a user error in parameters" + ); + } ); } @Test - public void testNativeQuestionMarkParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNativeQuestionMarkParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); - em.getTransaction().begin(); - Query query = em.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class ); + entityManager.persist( w ); + } ); + + scope.inTransaction( entityManager -> { + Query query = entityManager.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class ); query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + Wallet w = (Wallet) query.getSingleResult(); assertNotNull( w ); - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - - em.close(); - } + } ); } @Test - public void testNativeQueryWithPositionalParameter() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - Query query = em.createNativeQuery( "select * from Item where name = ?1", Item.class ); + public void testNativeQueryWithPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Query query = entityManager.createNativeQuery( "select * from Item where name = ?1", Item.class ); query.setParameter( 1, "Mouse" ); - item = (Item) query.getSingleResult(); + Item item = (Item) query.getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - query = em.createNativeQuery( "select * from Item where name = ?", Item.class ); + query = entityManager.createNativeQuery( "select * from Item where name = ?", Item.class ); query.setParameter( 1, "Mouse" ); item = (Item) query.getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testDistinct() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.createQuery( "delete Item" ).executeUpdate(); - em.createQuery( "delete Distributor" ).executeUpdate(); + public void testDistinct(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Distributor d1 = new Distributor(); d1.setName( "Fnac" ); Distributor d2 = new Distributor(); @@ -1414,32 +1057,22 @@ public void testDistinct() throws Exception { Item item = new Item( "Mouse", "Micro$oft mouse" ); item.getDistributors().add( d1 ); item.getDistributors().add( d2 ); - em.persist( d1 ); - em.persist( d2 ); - em.persist( item ); - em.flush(); - em.clear(); - Query q = em.createQuery( "select distinct i from Item i left join fetch i.distributors" ); - item = (Item) q.getSingleResult() - ; - //assertEquals( 1, distinctResult.size() ); - //item = (Item) distinctResult.get( 0 ); + entityManager.persist( d1 ); + entityManager.persist( d2 ); + entityManager.persist( item ); + entityManager.flush(); + entityManager.clear(); + + TypedQuery q = entityManager.createQuery( "select distinct i from Item i left join fetch i.distributors", Item.class ); + item = q.getSingleResult(); assertTrue( Hibernate.isInitialized( item.getDistributors() ) ); assertEquals( 2, item.getDistributors().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testIsNull() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testIsNull(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Distributor d1 = new Distributor(); d1.setName( "Fnac" ); Distributor d2 = new Distributor(); @@ -1448,222 +1081,153 @@ public void testIsNull() throws Exception { Item item2 = new Item( "Mouse2", "dd" ); item.getDistributors().add( d1 ); item.getDistributors().add( d2 ); - em.persist( d1 ); - em.persist( d2 ); - em.persist( item ); - em.persist( item2 ); - em.flush(); - em.clear(); - Query q = em.createQuery( - "select i from Item i where i.descr = :descr or (i.descr is null and cast(:descr as string) is null)" + entityManager.persist( d1 ); + entityManager.persist( d2 ); + entityManager.persist( item ); + entityManager.persist( item2 ); + entityManager.flush(); + entityManager.clear(); + + TypedQuery q = entityManager.createQuery( + "select i from Item i where i.descr = :descr or (i.descr is null and cast(:descr as string) is null)", Item.class ); - //Query q = em.createQuery( "select i from Item i where (i.descr is null and :descr is null) or (i.descr = :descr"); q.setParameter( "descr", "dd" ); - List result = q.getResultList(); + List result = q.getResultList(); assertEquals( 1, result.size() ); q.setParameter( "descr", null ); result = q.getResultList(); assertEquals( 1, result.size() ); - //item = (Item) distinctResult.get( 0 ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testUpdateQuery() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - - em.flush(); - em.clear(); + public void testUpdateQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + entityManager.flush(); + entityManager.clear(); assertEquals( - 1, em.createNativeQuery( - "update Item set descr = 'Logitech Mouse' where name = 'Mouse'" + 1, entityManager.createNativeQuery( + "update Item set descr = 'Logitech Mouse' where name = 'Mouse'", Item.class ).executeUpdate() ); - item = em.find( Item.class, item.getName() ); + item = entityManager.find( Item.class, item.getName() ); assertEquals( "Logitech Mouse", item.getDescr() ); - em.remove( item ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testUnavailableNamedQuery() throws Exception { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - try { - em.createNamedQuery( "wrong name" ); - fail( "Wrong named query should raise an exception" ); - } - catch (IllegalArgumentException e) { - //success - } + public void testUnavailableNamedQuery(EntityManagerFactoryScope scope) { + final Item item = new Item( "Mouse", "Micro$oft mouse" ); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createNamedQuery( "wrong name" ), + "Wrong named query should raise an exception" + ); + assertTrue( - "thrown IllegalArgumentException should of caused transaction to be marked for rollback only", - true == em.getTransaction().getRollbackOnly() + entityManager.getTransaction().getRollbackOnly(), + "thrown IllegalArgumentException should have caused transaction to be marked for rollback only" ); - em.getTransaction().rollback(); // HHH-8442 changed to rollback since thrown ISE causes - // transaction to be marked for rollback only. - // No need to remove entity since it was rolled back. + } ); - assertNull( - "entity should not of been saved to database since IllegalArgumentException should of" + - "caused transaction to be marked for rollback only", em.find( Item.class, item.getName() ) + scope.inTransaction( entityManager -> { + assertNull( entityManager.find( Item.class, item.getName() ), + "entity should not have been saved to database since IllegalArgumentException should have " + + "caused transaction to be marked for rollback only" ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testTypedNamedNativeQuery() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = em.createNamedQuery( "nativeItem1", Item.class ).getSingleResult(); - item = em.createNamedQuery( "nativeItem2", Item.class ).getSingleResult(); + public void testTypedNamedNativeQuery(EntityManagerFactoryScope scope) { + + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Item item = entityManager.createNamedQuery( "nativeItem1", Item.class ).getSingleResult(); + item = entityManager.createNamedQuery( "nativeItem2", Item.class ).getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testTypedScalarQueries() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testTypedScalarQueries(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Object[] itemData = em.createQuery( "select i.name,i.descr from Item i", Object[].class ).getSingleResult(); + scope.inTransaction( entityManager -> { + Object[] itemData = entityManager.createQuery( "select i.name,i.descr from Item i", Object[].class ).getSingleResult(); assertEquals( 2, itemData.length ); assertEquals( String.class, itemData[0].getClass() ); assertEquals( String.class, itemData[1].getClass() ); - Tuple itemTuple = em.createQuery( "select i.name,i.descr from Item i", Tuple.class ).getSingleResult(); + Tuple itemTuple = entityManager.createQuery( "select i.name,i.descr from Item i", Tuple.class ).getSingleResult(); assertEquals( 2, itemTuple.getElements().size() ); assertEquals( String.class, itemTuple.get( 0 ).getClass() ); assertEquals( String.class, itemTuple.get( 1 ).getClass() ); - Item itemView = em.createQuery( "select new Item(i.name,i.descr) from Item i", Item.class ) + Item itemView = entityManager.createQuery( "select new Item(i.name,i.descr) from Item i", Item.class ) .getSingleResult(); assertNotNull( itemView ); assertEquals( "Micro$oft mouse", itemView.getDescr() ); - itemView = em.createNamedQuery( "query-construct", Item.class ).getSingleResult(); + itemView = entityManager.createNamedQuery( "query-construct", Item.class ).getSingleResult(); assertNotNull( itemView ); assertEquals( "Micro$oft mouse", itemView.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10269") - public void testFailingNativeQuery() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - // Tests that Oracle does not run out of cursors. - for ( int i = 0; i < 1000; i++ ) { - try { - entityManager.createNativeQuery( "Select 1 from NotExistedTable" ).getResultList(); - fail( "expected PersistenceException" ); - } - catch (PersistenceException e) { - // expected - } - } - }finally { - entityManager.close(); - } - + public void testFailingNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + PersistenceException.class, + () -> { + // Tests that Oracle does not run out of cursors. + for ( int i = 0; i < 1000; i++ ) { + entityManager.createNativeQuery( "Select 1 from NonExistentTable" ).getResultList(); + } + }, + "Expected PersistenceException" + ); + } ); } @Test @JiraKey(value = "HHH-10833") - public void testGetSingleResultWithNoResultException() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.createQuery( "FROM Item WHERE name = 'bozo'" ).getSingleResult(); - fail( "Expected NoResultException" ); - } - catch ( Exception e ) { - assertTyping( NoResultException.class, e ); - } - finally { - entityManager.close(); - } + public void testGetSingleResultWithNoResultException(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + NoResultException.class, + () -> entityManager.createQuery( "FROM Item WHERE name = 'bozo'" ).getSingleResult(), + "Expected NoResultException" + ); + } ); } @Test - public void testGetSingleResultWithManyResultsException() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.getTransaction().begin(); + public void testGetSingleResultWithManyResultsException(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.persist( new Item( "1", "1" ) ); entityManager.persist( new Item( "2", "2" ) ); - entityManager.createQuery( "FROM Item" ).getSingleResult(); - fail( "Expected NoResultException" ); - } - catch ( Exception e ) { - assertTyping( NonUniqueResultException.class, e ); - } - finally { - entityManager.getTransaction().rollback(); - entityManager.close(); - } + assertThrows( + NonUniqueResultException.class, + () -> entityManager.createQuery( "FROM Item" ).getSingleResult(), + "Expected NonUniqueResultException" + ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java index a058580f1c36..3d91307333a2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java @@ -6,108 +6,84 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.io.Serializable; import java.util.List; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import org.hibernate.testing.orm.junit.JiraKey; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * @author Andrea Boriero */ -public class QueryWithLiteralsInSelectExpressionTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {QueryWithLiteralsInSelectExpressionTest.MyEntity.class}) +public class QueryWithLiteralsInSelectExpressionTest { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {MyEntity.class}; + @BeforeEach + public void init(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> entityManager.persist( new MyEntity( "Fab", "A" ) ) ); } - @Before - public void init() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.getTransaction().begin(); - entityManager.persist( new MyEntity( "Fab", "A" ) ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-10230") - public void testSelectLiterals() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectLiterals(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT true, false, e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( true, elements.get( 0 )[0] ); - Assert.assertEquals( false, elements.get( 0 )[1] ); - Assert.assertEquals( "Fab", elements.get( 0 )[2] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertEquals( true, elements.get( 0 )[0] ); + assertEquals( false, elements.get( 0 )[1] ); + assertEquals( "Fab", elements.get( 0 )[2] ); + } ); } @Test @JiraKey(value = "HHH-10230") - public void testSelectNonNullLiteralsCastToBoolean() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectNonNullLiteralsCastToBoolean(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT cast( true as boolean ), cast( false as boolean ), e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( true, elements.get( 0 )[ 0 ] ); - Assert.assertEquals( false, elements.get( 0 )[ 1 ] ); - Assert.assertEquals( "Fab", elements.get( 0 )[ 2 ] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertEquals( true, elements.get( 0 )[ 0 ] ); + assertEquals( false, elements.get( 0 )[ 1 ] ); + assertEquals( "Fab", elements.get( 0 )[ 2 ] ); + } ); } @Test @JiraKey(value = "HHH-10230") - public void testSelectNullLiterals() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectNullLiterals(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT cast(null as boolean), false, e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( null, elements.get( 0 )[ 0 ] ); - Assert.assertEquals( false, elements.get( 0 )[ 1 ] ); - Assert.assertEquals( "Fab", elements.get( 0 )[ 2 ] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertNull( elements.get( 0 )[0] ); + assertEquals( false, elements.get( 0 )[ 1 ] ); + assertEquals( "Fab", elements.get( 0 )[ 2 ] ); + } ); } @Entity(name = "MyEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java index 9786977a0d4a..7279d8b2999f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java @@ -57,7 +57,7 @@ public void testExecuteNativeQuery(EntityManagerFactoryScope scope) { entityManager -> { Query query = entityManager.createNamedQuery( QUERY_NAME ); query.setParameter( "value", 1 ); - List results = query.getResultList(); + List results = query.getResultList(); assertThat( results.size() ).isEqualTo( 1 ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java index 84039ec91afc..39dbdffc29ba 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java @@ -27,7 +27,7 @@ import jakarta.persistence.criteria.ParameterExpression; import jakarta.persistence.criteria.Root; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java index 729fad33aca5..50e727add6b2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java @@ -4,23 +4,23 @@ */ package org.hibernate.orm.test.jpa.query; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import jakarta.persistence.Column; import jakarta.persistence.ColumnResult; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; import jakarta.persistence.NamedNativeQuery; import jakarta.persistence.SqlResultSetMapping; import jakarta.persistence.Table; import org.hibernate.dialect.H2Dialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.RequiresDialect; -import org.junit.Test; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; /** * Tests for selecting scalar value from native queries. @@ -28,7 +28,8 @@ * @author Gunnar Morling */ @RequiresDialect(H2Dialect.class) -public class ScalarResultNativeQueryTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {ScalarResultNativeQueryTest.Person.class}) +public class ScalarResultNativeQueryTest { @Entity(name="Person") @Table(name="person") @@ -52,31 +53,16 @@ public Person(Integer id, int age) { } } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Person.class }; - } - @Test - public void shouldApplyConfiguredTypeForProjectionOfScalarValue() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, 29 ) ); - em.getTransaction().commit(); - em.close(); + public void shouldApplyConfiguredTypeForProjectionOfScalarValue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> entityManager.persist( new Person( 1, 29 ) ) ); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "personAge", String.class ).getResultList(); - assertEquals( 1, results.size() ); - assertEquals( "29", results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + List results = entityManager.createNamedQuery( "personAge", String.class ).getResultList(); + assertEquals( 1, results.size() ); + assertEquals( "29", results.get( 0 ) ); + } ); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> entityManager.createQuery( "delete from Person" ).executeUpdate() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java index c646ae6dbd66..1ff95023baa9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java @@ -5,44 +5,42 @@ package org.hibernate.orm.test.jpa.query; import org.hibernate.dialect.H2Dialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.NativeQuery; import org.hibernate.query.sql.internal.NativeQueryImpl; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import jakarta.persistence.*; import jakarta.persistence.criteria.CriteriaDelete; import java.util.List; import java.util.stream.Collectors; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; @RequiresDialect(H2Dialect.class) -public class TupleNativeQueryTest extends BaseEntityManagerFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[]{User.class}; - } +@Jpa(annotatedClasses = {TupleNativeQueryTest.User.class}) +public class TupleNativeQueryTest { - @Before - public void setUp() { - doInJPA(this::entityManagerFactory, entityManager -> { + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { User user = new User("Arnold"); entityManager.persist(user); }); } - @After - public void tearDown() { - doInJPA(this::entityManagerFactory, entityManager -> { + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaDelete delete = entityManager.getCriteriaBuilder().createCriteriaDelete(User.class); delete.from(User.class); entityManager.createQuery(delete).executeUpdate(); @@ -50,8 +48,8 @@ public void tearDown() { } @Test - public void testPositionalGetterShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -60,8 +58,8 @@ public void testPositionalGetterShouldWorkProperly() { } @Test - public void testPositionalGetterWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -69,70 +67,51 @@ public void testPositionalGetterWithClassShouldWorkProperly() { }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testAliasGetterWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -141,26 +120,31 @@ public void testAliasGetterWithoutExplicitAliasShouldWorkProperly() { } @Test - public void testAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -168,10 +152,9 @@ public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { }); } - @Test - public void testAliasGetterWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -180,8 +163,8 @@ public void testAliasGetterWithExplicitAliasShouldWorkProperly() { } @Test - public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -190,8 +173,8 @@ public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { } @Test - public void testToArrayShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testToArrayShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -199,8 +182,8 @@ public void testToArrayShouldWorkProperly() { } @Test - public void testGetElementsShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -212,8 +195,8 @@ public void testGetElementsShouldWorkProperly() { } @Test - public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -222,8 +205,8 @@ public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly() { } @Test - public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -231,70 +214,51 @@ public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly( }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -303,26 +267,31 @@ public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkPro } @Test - public void testAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -330,10 +299,9 @@ public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShou }); } - @Test - public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -342,8 +310,8 @@ public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProper } @Test - public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -352,8 +320,8 @@ public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldW } @Test - public void testToArrayShouldWithNamedNativeQueryWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testToArrayShouldWithNamedNativeQueryWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleNamedResult(entityManager, "standard"); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -361,8 +329,8 @@ public void testToArrayShouldWithNamedNativeQueryWorkProperly() { } @Test - public void testGetElementsWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleNamedResult(entityManager, "standard"); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -374,8 +342,8 @@ public void testGetElementsWithNamedNativeQueryShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -384,8 +352,8 @@ public void testStreamedPositionalGetterShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -393,70 +361,51 @@ public void testStreamedPositionalGetterWithClassShouldWorkProperly() { }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -465,26 +414,31 @@ public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly() { } @Test - public void testStreamedAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testStreamedAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testStreamedAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -492,10 +446,9 @@ public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProper }); } - @Test - public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -504,8 +457,8 @@ public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly() { } @Test - public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -514,8 +467,8 @@ public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly( } @Test - public void testStreamedToArrayShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedToArrayShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedTupleResult(entityManager); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -523,8 +476,8 @@ public void testStreamedToArrayShouldWorkProperly() { } @Test - public void testStreamedGetElementsShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedGetElementsShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedTupleResult(entityManager); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -536,8 +489,8 @@ public void testStreamedGetElementsShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -546,8 +499,8 @@ public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly() } @Test - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -555,70 +508,51 @@ public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkP }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -627,26 +561,31 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShoul } @Test - public void testStreamedAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testStreamedAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testStreamedAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -654,10 +593,9 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitA }); } - @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -666,8 +604,8 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWo } @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -676,8 +614,8 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAlia } @Test - public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedNamedTupleResult(entityManager, "standard"); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -685,8 +623,8 @@ public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly() { } @Test - public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedNamedTupleResult(entityManager, "standard"); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -699,12 +637,12 @@ public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly() { @Test @JiraKey(value = "HHH-11897") - public void testGetElementsShouldNotThrowExceptionWhenResultContainsNullValue() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsShouldNotThrowExceptionWhenResultContainsNullValue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { User user = entityManager.find(User.class, 1L); user.firstName = null; }); - doInJPA(this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); final Tuple tuple = tuples.get(0); List> result = tuple.getElements(); @@ -741,7 +679,6 @@ private List getTupleResult(EntityManager entityManager) { return (List) query.getResultList(); } - @SuppressWarnings("unchecked") private List getTupleNamedResult(EntityManager entityManager, String name) { return entityManager.createNamedQuery(name, Tuple.class).getResultList(); } @@ -769,6 +706,7 @@ private List getStreamedNamedTupleResult(EntityManager entityManager, Str query = "SELECT id AS alias1, firstname AS alias2 FROM users" ) }) + public static class User { @Id private long id; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java index 64101cf1f4d8..fe4400ca135a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java @@ -198,7 +198,6 @@ public List assemble(final Serializable cached, final Object owner) thro } @Override - @SuppressWarnings("unchecked") public List deepCopy(final List o) throws HibernateException { return o == null ? null : new ArrayList<>( o ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java index 8436f7276005..db9ca0028bc7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java @@ -4,14 +4,15 @@ */ package org.hibernate.orm.test.jpa.spi; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - import jakarta.persistence.Tuple; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Maksym Symonov @@ -22,7 +23,7 @@ public class NativeQueryTupleTransformerTest { @Test public void nullValueIsExtractedFromTuple() { - final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple( + final Tuple tuple = nativeQueryTupleTransformer.transformTuple( new Object[] { 1L, null }, new String[] { "id", "value" } ); @@ -30,12 +31,17 @@ public void nullValueIsExtractedFromTuple() { assertNull(tuple.get("value")); } - @Test(expected = IllegalArgumentException.class) + @Test public void missingAliasCausesExceptionWhenIsExtractedFromTuple() { - final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple( - new Object[] { 1L, null }, - new String[] { "id", "value" } + assertThrows( + IllegalArgumentException.class, + () -> { + final Tuple tuple = nativeQueryTupleTransformer.transformTuple( + new Object[] {1L, null}, + new String[] {"id", "value"} + ); + tuple.get( "unknownAlias" ); + } ); - tuple.get("unknownAlias"); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java index f2e2d140ed12..78ff33262007 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java @@ -12,121 +12,116 @@ import jakarta.persistence.criteria.Root; import org.hibernate.Hibernate; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Assert; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author alan.oleary */ -public class ComponentCriteriaTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Client.class, Alias.class }; +@Jpa(annotatedClasses = {Client.class, Alias.class}) +public class ComponentCriteriaTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmbeddableInPath() { + public void testEmbeddableInPath(EntityManagerFactoryScope scope) { Client client = new Client( 111, "steve", "ebersole" ); - doInJPA( this::entityManagerFactory, em -> { - em.persist( client ); - } ); + scope.inTransaction( entityManager -> entityManager.persist( client ) ); - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); cq.where( cb.equal( root.get( "name" ).get( "firstName" ), client.getName().getFirstName() ) ); - List list = em.createQuery( cq ).getResultList(); - Assert.assertEquals( 1, list.size() ); + List list = entityManager.createQuery( cq ).getResultList(); + assertEquals( 1, list.size() ); } ); // HHH-5792 - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN c.name n WHERE n.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); - } ); - - doInJPA( this::entityManagerFactory, em -> { - em.createQuery( "delete Client" ).executeUpdate(); + assertEquals( 1, q.getResultList().size() ); } ); } @Test @JiraKey(value = "HHH-9642") - public void testOneToManyJoinFetchedInEmbeddable() { + public void testOneToManyJoinFetchedInEmbeddable(EntityManagerFactoryScope scope) { Client client = new Client( 111, "steve", "ebersole" ); Alias alias = new Alias( "a", "guy", "work" ); client.getName().getAliases().add( alias ); - doInJPA( this::entityManagerFactory, em -> { - em.persist( client ); - } ); + scope.inTransaction( entityManager -> entityManager.persist( client ) ); List list = new ArrayList<>(); - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); root.fetch( Client_.name ).fetch( Name_.aliases ); cq.where( cb.equal( root.get( "name" ).get( "firstName" ), client.getName().getFirstName() ) ); - list.addAll( em.createQuery( cq ).getResultList() ); - Assert.assertEquals( 1, list.size() ); + list.addAll( entityManager.createQuery( cq ).getResultList() ); + assertEquals( 1, list.size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN FETCH c.name.aliases WHERE c.name.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); + assertEquals( 1, q.getResultList().size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN c.name n join FETCH n.aliases WHERE c.name.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); + assertEquals( 1, q.getResultList().size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - Client c = em.merge( client ); - em.remove( c ); + scope.inTransaction( entityManager -> { + Client c = entityManager.merge( client ); + entityManager.remove( c ); } ); } @Test @JiraKey(value = "HHH-4586") - public void testParameterizedFunctions() { - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testParameterizedFunctions(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); // lower CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); cq.where( cb.equal( cb.lower( root.get( Client_.name ).get( Name_.lastName ) ), "test" ) ); - em.createQuery( cq ).getResultList(); + entityManager.createQuery( cq ).getResultList(); // upper cq = cb.createQuery( Client.class ); root = cq.from( Client.class ); cq.where( cb.equal( cb.upper( root.get( Client_.name ).get( Name_.lastName ) ), "test" ) ); - em.createQuery( cq ).getResultList(); + entityManager.createQuery( cq ).getResultList(); } ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java index 15bd24bc677b..1143554aa194 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java @@ -119,7 +119,7 @@ public void testPersistThenCloseWithAnActiveTransaction(EntityManagerFactoryScop } scope.inEntityManager( em -> { - final List results = em.createQuery( "from Box" ).getResultList(); + final List results = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( results.size(), is( 1 ) ); } ); @@ -160,7 +160,7 @@ public void testMergeThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertThat( boxes.get( 0 ).getMuffinSet().size(), is( 1 ) ); } @@ -202,7 +202,7 @@ public void testMergeWithDeletionOrphanRemovalThenCloseWithAnActiveTransaction(E scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from SmallBox" ).getResultList(); + final List boxes = em.createQuery( "from SmallBox", SmallBox.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertTrue( boxes.get( 0 ).isEmpty() ); } @@ -243,7 +243,7 @@ public void testUpdateThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertThat( boxes.get( 0 ).getMuffinSet().size(), is( 1 ) ); } @@ -286,7 +286,7 @@ public void testRemoveThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 0 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java index 71968496f37d..270701ef9c40 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java @@ -4,18 +4,6 @@ */ package org.hibernate.orm.test.jpa.transaction; -import java.util.List; -import java.util.Map; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.StaleObjectStateException; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.stat.Statistics; - -import org.junit.Test; - import jakarta.persistence.EntityManager; import jakarta.persistence.LockModeType; import jakarta.persistence.OptimisticLockException; @@ -24,307 +12,307 @@ import jakarta.persistence.RollbackException; import jakarta.persistence.TransactionRequiredException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.StaleObjectStateException; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.stat.Statistics; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard */ -public class FlushAndTransactionTest extends BaseEntityManagerFunctionalTestCase { - @Test - public void testAlwaysTransactionalOperations() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.getTransaction().commit(); - try { - em.flush(); - fail( "flush has to be inside a Tx" ); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.lock( book, LockModeType.READ ); - fail( "lock has to be inside a Tx" ); - } - catch (TransactionRequiredException e) { - //success - } - em.getTransaction().begin(); - em.remove( em.find( Book.class, book.id ) ); - em.getTransaction().commit(); - em.close(); +@Jpa( + annotatedClasses = {Book.class}, + integrationSettings = {@Setting(name = AvailableSettings.JPA_TRANSACTION_COMPLIANCE, value = "true")}, + generateStatistics = true +) +public class FlushAndTransactionTest { + + @AfterEach + public void afterEach(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testTransactionalOperationsWhenExtended() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - Statistics stats = entityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - stats.clear(); - stats.setStatisticsEnabled( true ); - - em.persist( book ); - assertEquals( 0, stats.getEntityInsertCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityInsertCount() ); - - em.clear(); - book.name = "Le prince"; - book = em.merge( book ); - - em.refresh( book ); - assertEquals( 0, stats.getEntityUpdateCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 0, stats.getEntityUpdateCount() ); - - book.name = "Le prince"; - em.getTransaction().begin(); - em.find( Book.class, book.id ); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityUpdateCount() ); - - em.remove( book ); - assertEquals( 0, stats.getEntityDeleteCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityDeleteCount() ); - - em.close(); - stats.setStatisticsEnabled( false ); + public void testAlwaysTransactionalOperations(EntityManagerFactoryScope scope) { + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.getTransaction().commit(); + + assertThrows( + TransactionRequiredException.class, + entityManager::flush + ); + + assertThrows( + TransactionRequiredException.class, + () -> entityManager.lock( book, LockModeType.READ ) + ); + } + ); } @Test - public void testMergeWhenExtended() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - Statistics stats = entityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - - em.getTransaction().begin(); - em.persist( book ); - assertEquals( 0, stats.getEntityInsertCount() ); - em.getTransaction().commit(); - - em.clear(); //persist and clear + public void testTransactionalOperationsWhenExtended(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); stats.clear(); - stats.setStatisticsEnabled( true ); - - Book bookReloaded = em.find( Book.class, book.id ); - - book.name = "Le prince"; - assertEquals( "Merge should use the available entiies in the PC", em.merge( book ), bookReloaded ); - assertEquals( book.name, bookReloaded.name ); - - assertEquals( 0, stats.getEntityDeleteCount() ); - assertEquals( 0, stats.getEntityInsertCount() ); - assertEquals( "Updates should have been queued", 0, stats.getEntityUpdateCount() ); - - em.getTransaction().begin(); - Book bookReReloaded = em.find( Book.class, bookReloaded.id ); - assertEquals( "reload should return the object in PC", bookReReloaded, bookReloaded ); - assertEquals( bookReReloaded.name, bookReloaded.name ); - em.getTransaction().commit(); - - assertEquals( 0, stats.getEntityDeleteCount() ); - assertEquals( 0, stats.getEntityInsertCount() ); - assertEquals( "Work on Tx should flush", 1, stats.getEntityUpdateCount() ); - em.getTransaction().begin(); - em.remove( bookReReloaded ); - em.getTransaction().commit(); - - em.close(); - stats.setStatisticsEnabled( false ); + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + entityManager.persist( book ); + assertEquals( 0, stats.getEntityInsertCount() ); + + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityInsertCount() ); + + entityManager.clear(); + book.name = "Le prince"; + book = entityManager.merge( book ); + + entityManager.refresh( book ); + assertEquals( 0, stats.getEntityUpdateCount() ); + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 0, stats.getEntityUpdateCount() ); + + book.name = "Le prince"; + entityManager.getTransaction().begin(); + entityManager.find( Book.class, book.id ); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityUpdateCount() ); + + entityManager.remove( book ); + assertEquals( 0, stats.getEntityDeleteCount() ); + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityDeleteCount() ); + } + ); } @Test - public void testCloseAndTransaction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.close(); - - assertFalse( em.isOpen() ); - try { - em.flush(); - fail( "direct action on a closed em should fail" ); - } - catch (IllegalStateException e) { - //success - } - finally { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); + public void testMergeWhenExtended(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); + + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + + entityManager.getTransaction().begin(); + entityManager.persist( book ); + assertEquals( 0, stats.getEntityInsertCount() ); + entityManager.getTransaction().commit(); + + entityManager.clear(); //persist and clear + stats.clear(); + + Book bookReloaded = entityManager.find( Book.class, book.id ); + book.name = "Le prince"; + assertEquals( entityManager.merge( book ), bookReloaded, + "Merge should use the available entiies in the PC" ); + assertEquals( book.name, bookReloaded.name ); + + assertEquals( 0, stats.getEntityDeleteCount() ); + assertEquals( 0, stats.getEntityInsertCount() ); + assertEquals( 0, stats.getEntityUpdateCount(), "Updates should have been queued" ); + + entityManager.getTransaction().begin(); + Book bookReReloaded = entityManager.find( Book.class, bookReloaded.id ); + assertEquals( bookReReloaded, bookReloaded, "reload should return the object in PC" ); + assertEquals( bookReReloaded.name, bookReloaded.name ); + entityManager.getTransaction().commit(); + + assertEquals( 0, stats.getEntityDeleteCount() ); + assertEquals( 0, stats.getEntityInsertCount() ); + assertEquals( 1, stats.getEntityUpdateCount(), "Work in Tx should flush" ); } - } + ); } @Test - public void testTransactionCommitDoesNotFlush() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.persist( book ); - em.getTransaction().commit(); - em.close(); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List result = em.createQuery( "select book from Book book where book.name = :title" ). - setParameter( "title", book.name ).getResultList(); - assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() ); - em.getTransaction().commit(); - em.close(); + public void testCloseAndTransaction(EntityManagerFactoryScope scope) { + EntityManager entityManager = scope.fromEntityManager( + em -> { + em.getTransaction().begin(); + Book book = new Book(); + book.name = "Java for Dummies"; + return em; + } + ); + assertFalse( entityManager.isOpen() ); + + assertThrows( + IllegalStateException.class, + entityManager::flush, + "direct action on a closed em should fail" + ); } @Test - public void testTransactionAndContains() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.persist( book ); - em.getTransaction().commit(); - em.close(); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List result = em.createQuery( "select book from Book book where book.name = :title" ). - setParameter( "title", book.name ).getResultList(); - assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() ); - assertTrue( em.contains( result.get( 0 ) ) ); - em.getTransaction().commit(); - assertTrue( em.contains( result.get( 0 ) ) ); - em.close(); + public void testTransactionCommitDoesNotFlush(EntityManagerFactoryScope scope) { + Book book = scope.fromTransaction( entityManager -> { + Book _book = new Book(); + _book.name = "Java for Dummies"; + entityManager.persist( _book ); + return _book; + } ); + scope.inTransaction( entityManager -> { + List result = entityManager.createQuery( "select book from Book book where book.name = :title", Book.class ). + setParameter( "title", book.name ).getResultList(); + assertEquals( 1, result.size(), "EntityManager.commit() should trigger a flush()" ); + } ); } @Test - public void testRollbackOnlyOnPersistenceException() { + public void testTransactionAndContains(EntityManagerFactoryScope scope) { + Book book = scope.fromTransaction( entityManager -> { + Book _book = new Book(); + _book.name = "Java for Dummies"; + entityManager.persist( _book ); + return _book; + } ); + + scope.inEntityManager( entityManager -> { + entityManager.getTransaction().begin(); + List result = entityManager.createQuery( "select book from Book book where book.name = :title", Book.class ). + setParameter( "title", book.name ).getResultList(); + assertEquals( 1, result.size(), "EntityManager.commit() should trigger a flush()" ); + assertTrue( entityManager.contains( result.get( 0 ) ) ); + entityManager.getTransaction().commit(); + assertTrue( entityManager.contains( result.get( 0 ) ) ); + } ); + } + + @Test + public void testRollbackOnlyOnPersistenceException(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; book.id = null; //new Integer( 50 ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid" ); - em.merge( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid2" ); //non updated version - em.merge( book ); - em.flush(); - fail( "optimistic locking exception" ); - } - catch (PersistenceException e) { - //success - } - - try { - em.getTransaction().commit(); - fail( "Commit should be rollbacked" ); - } - catch (RollbackException e) { - //success - } - finally { - em.close(); - } + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + + assertThrows( + PersistenceException.class, + () -> { + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid" ); + entityManager.merge( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid2" ); //non updated version + entityManager.merge( book ); + entityManager.flush(); + }, + "optimistic locking exception expected" + ); + + assertThrows( + RollbackException.class, + () -> entityManager.getTransaction().commit(), + "Commit should be rolled back" + ); + } + ); } @Test - public void testRollbackExceptionOnOptimisticLockException() { + public void testRollbackExceptionOnOptimisticLockException(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; book.id = null; //new Integer( 50 ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid" ); - em.merge( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid2" ); //non updated version - try { - em.unwrap( Session.class ).merge( book ); - em.getTransaction().commit(); - fail( "Commit should be rollbacked" ); - } - catch (OptimisticLockException e) { - assertTrue( - "During flush a StateStateException is wrapped into a OptimisticLockException", - e.getCause() instanceof StaleObjectStateException - ); - } - finally { - em.close(); - } - + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid" ); + entityManager.merge( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid2" ); //non updated version + + assertInstanceOf( + StaleObjectStateException.class, + assertThrows( + OptimisticLockException.class, + () -> { + entityManager.unwrap( Session.class ).merge( book ); + entityManager.getTransaction().commit(); + }, + "Commit should be rolled back" + ).getCause(), + "During flush a StateStateException is wrapped into a OptimisticLockException" + ); + } + ); } @Test - public void testRollbackClearPC() { + public void testRollbackClearPC(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.getTransaction().commit(); - em.getTransaction().begin(); - book.name = "Recovered keys"; - em.merge( book ); - em.getTransaction().rollback(); - em.getTransaction().begin(); - assertEquals( "Stolen keys", em.find( Book.class, book.id ).name ); - em.getTransaction().commit(); - em.close(); + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.getTransaction().commit(); + entityManager.getTransaction().begin(); + book.name = "Recovered keys"; + entityManager.merge( book ); + entityManager.getTransaction().rollback(); + entityManager.getTransaction().begin(); + assertEquals( "Stolen keys", entityManager.find( Book.class, book.id ).name ); + entityManager.getTransaction().commit(); + } + ); } @Test - public void testSetRollbackOnlyAndFlush() { + public void testSetRollbackOnlyAndFlush(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "The jungle book"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.getTransaction().setRollbackOnly(); - em.persist( book ); - em.flush(); - em.getTransaction().rollback(); - em.getTransaction().begin(); - Query query = em.createQuery( "SELECT b FROM Book b WHERE b.name = :name" ); - query.setParameter( "name", book.name ); - assertEquals( 0, query.getResultList().size() ); - em.getTransaction().commit(); - em.close(); - } - - - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Book.class - }; + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.getTransaction().setRollbackOnly(); + entityManager.persist( book ); + entityManager.flush(); + entityManager.getTransaction().rollback(); + entityManager.getTransaction().begin(); + Query query = entityManager.createQuery( "SELECT b FROM Book b WHERE b.name = :name" ); + query.setParameter( "name", book.name ); + assertEquals( 0, query.getResultList().size() ); + entityManager.getTransaction().commit(); + } + ); } - @Override - protected void addConfigOptions(Map options) { - super.addConfigOptions( options ); - options.put( AvailableSettings.JPA_TRANSACTION_COMPLIANCE, "true" ); - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java index 02cc409e6e44..6d73637420a5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java @@ -65,7 +65,7 @@ public void entityTransactionShouldBeReusableTest(EntityManagerFactoryScope scop scope.inTransaction( entityManager -> { - List results = entityManager.createQuery( "from TestEntity" ).getResultList(); + List results = entityManager.createQuery( "from TestEntity", TestEntity.class ).getResultList(); assertThat( results.size(), is( 2 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java index d52f72ab2925..fa6a1c0a2f19 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java @@ -30,7 +30,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -83,7 +83,7 @@ public void assertConnectionIsReleasedIfCommitFails() { em.close(); } - assertEquals( false, connectionIsOpen.get(), "The connection was not released" ); + assertFalse( connectionIsOpen.get(), "The connection was not released" ); } @Test @@ -94,7 +94,7 @@ public void assertConnectionIsReleasedIfRollbackFails() { em.getTransaction().begin(); // Force connection acquisition em.createQuery( "select 1" ).getResultList(); - assertEquals( true, connectionIsOpen.get() ); + assertTrue( connectionIsOpen.get() ); transactionFailureTrigger.set( true ); em.getTransaction().rollback(); fail( "Rollback failure, Exception expected" ); @@ -109,7 +109,7 @@ public void assertConnectionIsReleasedIfRollbackFails() { em.close(); } - assertEquals( false, connectionIsOpen.get(), "The connection was not released" ); + assertFalse( connectionIsOpen.get(), "The connection was not released" ); } private Map basicSettings() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java index 278106d2e341..711e040dde6e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java @@ -94,7 +94,7 @@ public void checkRollBackTransactionIsExecutedOnceWhenACommitFails(EntityManager } @Entity(name = "Shipment") - public class Shipment { + public static class Shipment { @Id private String id; @@ -138,7 +138,7 @@ public void setState(String state) { } - private class OperationCollectorObserver implements TransactionObserver { + private static class OperationCollectorObserver implements TransactionObserver { int unSuccessfulAfterCompletion; @Override diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java index e61b38b069da..67b114e8f780 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java @@ -4,131 +4,102 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import jakarta.persistence.EntityManager; - -import org.junit.Test; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.proxy.HibernateProxy; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; /** * @author Emmanuel Bernard */ -public class GetIdentifierTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = { + Book.class, + Umbrella.class, + Sickness.class, + Author.class, + Article.class +}) +public class GetIdentifierTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test - public void testSimpleId() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testSimpleId(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); - em.persist( book ); - em.flush(); - assertEquals( book.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( book ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( book ); + entityManager.flush(); + assertEquals( book.getId(), entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( book ) ); + } ); } @Test @JiraKey(value = "HHH-7561") - public void testProxyObject() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testProxyObject(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); - em.persist( book ); - em.flush(); - em.clear(); // Clear persistence context to receive proxy object below. - Book proxy = em.getReference( Book.class, book.getId() ); - assertTrue( proxy instanceof HibernateProxy ); - assertEquals( book.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( proxy ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); // Clear persistence context to receive proxy object below. + Book proxy = entityManager.getReference( Book.class, book.getId() ); + assertInstanceOf( HibernateProxy.class, proxy ); + assertEquals( book.getId(), entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( proxy ) ); + } ); - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + scope.inTransaction( entityManager -> { Author author = new Author(); Article article = new Article( author ); - em.persist( author ); - em.persist( article ); - em.flush(); - em.clear(); // Clear persistence context to receive proxy relation below. - article = em.find( Article.class, article.getId() ); - assertTrue( article.getAuthor() instanceof HibernateProxy ); + entityManager.persist( author ); + entityManager.persist( article ); + entityManager.flush(); + entityManager.clear(); // Clear persistence context to receive proxy relation below. + article = entityManager.find( Article.class, article.getId() ); + assertInstanceOf( HibernateProxy.class, article.getAuthor() ); assertEquals( author.getId(), - em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( article.getAuthor() ) + entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( article.getAuthor() ) ); - - } - finally { - em.getTransaction().rollback(); - em.close(); - } + } ); } @Test - public void testEmbeddedId() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testEmbeddedId(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Umbrella umbrella = new Umbrella(); umbrella.setId( new Umbrella.PK() ); umbrella.getId().setBrand( "Burberry" ); umbrella.getId().setModel( "Red Hat" ); - em.persist( umbrella ); - em.flush(); + entityManager.persist( umbrella ); + entityManager.flush(); assertEquals( umbrella.getId(), - em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( umbrella ) + entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( umbrella ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + } ); } @Test - public void testIdClass() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testIdClass(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Sickness sick = new Sickness(); - sick.setClassification( "H1N1" ); sick.setType( "Flu" ); - em.persist( sick ); - em.flush(); + entityManager.persist( sick ); + entityManager.flush(); Sickness.PK id = new Sickness.PK(); id.setClassification( sick.getClassification() ); id.setType( sick.getType() ); - assertEquals( id, em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( sick ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + assertEquals( id, entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( sick ) ); + } ); } - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Book.class, - Umbrella.class, - Sickness.class, - Author.class, - Article.class - }; - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java index a68ea4decbd6..037bdf2f19bd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java @@ -4,46 +4,42 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import jakarta.persistence.EntityManager; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard */ -public class IsLoadedTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = { + Author.class, + Book.class, + CopyrightableContent.class +}) +public class IsLoadedTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test - public void testIsLoadedOnPrivateSuperclassProperty() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testIsLoadedOnPrivateSuperclassProperty(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Author a = new Author(); Book book = new Book( a ); - em.persist( a ); - em.persist( book ); - em.flush(); - em.clear(); - book = em.find( Book.class, book.getId() ); - assertTrue( em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book ) ); - assertFalse( em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book, "author" ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( a ); + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book = entityManager.find( Book.class, book.getId() ); + assertTrue( entityManager.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book ) ); + assertFalse( entityManager.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book, "author" ) ); + } ); } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Author.class, - Book.class, - CopyrightableContent.class - }; - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java index 79e0a2739904..dceac4aa3fb9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java @@ -10,9 +10,9 @@ import org.hibernate.engine.spi.PersistentAttributeInterceptor; import org.hibernate.jpa.internal.util.PersistenceUtilHelper; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for HHH-5094 and HHH-5334 diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java index ff24c82abbed..fcad62e857f4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java @@ -4,11 +4,11 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import org.hibernate.jpa.internal.util.PessimisticNumberParser; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * @author Sanne Grinovero diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java index 0f08a06446de..a90079023dc5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java @@ -8,17 +8,18 @@ import jakarta.persistence.spi.LoadState; import org.hibernate.jpa.internal.util.PersistenceUtilHelper; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Steve Ebersole */ -public class ProviderUtilTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {Author.class}) +public class ProviderUtilTest { private final PersistenceUtilHelper.MetadataCache cache = new PersistenceUtilHelper.MetadataCache(); @@ -60,12 +61,4 @@ public void testIsLoadedWithReferenceOnKnownClass() { assertEquals( LoadState.UNKNOWN, PersistenceUtilHelper.isLoadedWithReference( entity, "attribute", cache ) ); } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Author.class, - Book.class, - CopyrightableContent.class - }; - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java index 6d6563122b09..ab2277208832 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java @@ -4,117 +4,101 @@ */ package org.hibernate.orm.test.jpa.version; -import org.junit.Test; - -import org.hibernate.Session; +import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Steve Ebersole */ @JiraKey( value = "HHH-7138" ) -public class JpaSpecVersionValueUpdatingTest extends BaseCoreFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Customer.class, Order.class }; - } +@DomainModel(annotatedClasses = {Customer.class, Order.class}) +@SessionFactory +public class JpaSpecVersionValueUpdatingTest { + + @AfterEach + public void afterEach(SessionFactoryScope scope) { scope.dropData(); } @Test - public void testVersionNotIncrementedOnModificationOfNonOwningCollectionNonCascaded() { - Session session = openSession(); - session.beginTransaction(); - Customer customer = new Customer(); - customer.id = 1L; - session.persist( customer ); - session.getTransaction().commit(); - session.close(); - - long initial = customer.version; - - session = openSession(); - session.beginTransaction(); - customer = session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order = new Order(); - order.id = 1L; - order.customer = customer; - customer.orders.add( order ); - session.persist( order ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order2 = new Order(); - order2.id = 2L; - order2.customer = customer; - customer.orders.add( order2 ); - session.persist( order2 ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.getReference( Customer.class, 1L ); - assertEquals( initial, customer.version ); - session.remove( customer ); - session.getTransaction().commit(); - session.close(); + public void testVersionNotIncrementedOnModificationOfNonOwningCollectionNonCascaded(SessionFactoryScope scope) { + final Customer initialCustomer = new Customer(); + initialCustomer.id = 1L; + + scope.inTransaction( session -> session.persist( initialCustomer ) ); + + long initialVersion = initialCustomer.version; + + Customer customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order = new Order(); + order.id = 1L; + order.customer = c; + c.orders.add( order ); + session.persist( order ); + return c; + } ); + assertEquals( initialVersion, customer.version ); + + customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order2 = new Order(); + order2.id = 2L; + order2.customer = c; + c.orders.add( order2 ); + session.persist( order2 ); + return c; + } ); + assertEquals( initialVersion, customer.version ); + + scope.inTransaction( session -> { + Customer c = session.getReference( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + } ); } @Test - public void testVersionNotIncrementedOnModificationOfNonOwningCollectionCascaded() { - Customer customer = new Customer(); - customer.id = 1L; - - Session session = openSession(); - session.beginTransaction(); - session.persist( customer ); - session.getTransaction().commit(); - session.close(); - - long initial = customer.version; - - session = openSession(); - session.beginTransaction(); - customer = (Customer) session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order = new Order(); - order.id = 1L; - order.customer = customer; - customer.orders.add( order ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = (Customer) session.get( Customer.class, 1L ); - Order order2 = new Order(); - order2.id = 2L; - order2.customer = customer; - customer.orders.add( order2 ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.getReference( Customer.class, 1L ); - assertEquals( initial, customer.version ); - session.remove( customer ); - session.getTransaction().commit(); - session.close(); + public void testVersionNotIncrementedOnModificationOfNonOwningCollectionCascaded(SessionFactoryScope scope) { + Customer initialCustomer = new Customer(); + initialCustomer.id = 1L; + + scope.inTransaction( session -> session.persist( initialCustomer ) ); + + long initialVersion = initialCustomer.version; + + Customer customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order = new Order(); + order.id = 1L; + order.customer = c; + c.orders.add( order ); + return c; + } + ); + assertEquals( initialVersion, customer.version ); + + customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + Order order2 = new Order(); + order2.id = 2L; + order2.customer = c; + c.orders.add( order2 ); + return c; + } + ); + assertEquals( initialVersion, customer.version ); + + scope.inTransaction( session -> { + Customer c = session.getReference( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java index 367c09bdf8d5..576ba3d89b43 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java @@ -4,12 +4,6 @@ */ package org.hibernate.orm.test.jpa.xml.versions; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.PersistenceException; import jakarta.persistence.SharedCacheMode; @@ -17,17 +11,24 @@ import jakarta.persistence.spi.ClassTransformer; import jakarta.persistence.spi.PersistenceUnitInfo; import jakarta.persistence.spi.PersistenceUnitTransactionType; -import javax.sql.DataSource; import org.hibernate.AnnotationException; import org.hibernate.InvalidMappingException; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.orm.test.jpa.pack.defaultpar.Lighter; import org.hibernate.orm.test.jpa.pack.defaultpar_1_0.Lighter1; - import org.hibernate.testing.util.ServiceRegistryUtil; -import org.junit.Assert; -import org.junit.Test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; /** * "smoke" tests for JEE bootstrapping of HEM via a {@link PersistenceUnitInfo} @@ -87,7 +88,7 @@ public void testInvalidOrm1() { .addMappingFileName( "org/hibernate/orm/test/jpa/xml/versions/invalid-orm-1_0.xml" ); HibernatePersistenceProvider hp = new HibernatePersistenceProvider(); try ( EntityManagerFactory emf = hp.createContainerEntityManagerFactory( pui, getDefaultPuConfig() ) ) { - Assert.fail("expecting 'invalid content' error"); + Assertions.fail("expecting 'invalid content' error"); } catch (InvalidMappingException | AnnotationException expected) { // expected condition