From cf1695adc7f1bad80230240f755fed5ecf3a9e6a Mon Sep 17 00:00:00 2001 From: Chris Witteveen Date: Mon, 8 Jul 2024 17:16:56 +0200 Subject: [PATCH 1/2] Add test case for HHH-17680 --- .../org/hibernate/entities/EntityArray.java | 47 ++++++++++++++++ .../org/hibernate/entities/EntityJSON.java | 47 ++++++++++++++++ .../test/EntityArrayLoadedFirstTestCase.java | 53 +++++++++++++++++++ .../test/EntityJsonLoadedFirstTestCase.java | 52 ++++++++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityArray.java create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityJSON.java create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityArray.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityArray.java new file mode 100644 index 00000000..d9e36b46 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityArray.java @@ -0,0 +1,47 @@ +package org.hibernate.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.List; + +@Entity +public class EntityArray { + + @Id + @GeneratedValue + private long id; + + @JdbcTypeCode(SqlTypes.ARRAY) + private List listString; + + @JdbcTypeCode(SqlTypes.ARRAY) + private List listInteger; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public List getListString() { + return listString; + } + + public void setListString(List listA) { + this.listString = listA; + } + + public List getListInteger() { + return listInteger; + } + + public void setListInteger(List listB) { + this.listInteger = listB; + } +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityJSON.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityJSON.java new file mode 100644 index 00000000..1e6a6027 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityJSON.java @@ -0,0 +1,47 @@ +package org.hibernate.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.List; + +@Entity +public class EntityJSON { + + @Id + @GeneratedValue + private long id; + + @JdbcTypeCode(SqlTypes.JSON) + private List listString; + + @JdbcTypeCode(SqlTypes.JSON) + private List listInteger; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public List getListString() { + return listString; + } + + public void setListString(List listA) { + this.listString = listA; + } + + public List getListInteger() { + return listInteger; + } + + public void setListInteger(List listB) { + this.listInteger = listB; + } +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java new file mode 100644 index 00000000..2660d374 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java @@ -0,0 +1,53 @@ +package org.hibernate.test; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.entities.EntityArray; +import org.hibernate.entities.EntityJSON; +import org.junit.Before; +import org.junit.Test; + +/** + * This template demonstrates how to develop a standalone test case for Hibernate ORM. Although this is perfectly + * acceptable as a reproducer, usage of ORMUnitTestCase is preferred! + */ +public class EntityArrayLoadedFirstTestCase { + + private Metadata metadata; + private SessionFactory sf; + + @Before + public void setup() { + StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder() + // Add in any settings that are specific to your test. See resources/hibernate.properties for the defaults. + .applySetting( "hibernate.show_sql", "true" ) + .applySetting( "hibernate.format_sql", "true" ) + .applySetting( "hibernate.hbm2ddl.auto", "update" ); + + metadata = new MetadataSources( srb.build() ) + // Add your entities here. + .addAnnotatedClass( EntityArray.class ) + .addAnnotatedClass( EntityJSON.class ) + .buildMetadata(); + + sf = metadata.buildSessionFactory(); + } + + // Add your tests, using standard JUnit. + @Test + public void hhh17680TestSucceedsForListString() throws Exception { + var entityArray_listString = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listString").getType(); + var entityJSON_listString = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listString").getType(); + assert entityArray_listString != entityJSON_listString; + } + + @Test + public void hhh17680TestSucceedsForListInteger() throws Exception { + var entityArray_listInteger = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listInteger").getType(); + var entityJSON_listInteger = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listInteger").getType(); + assert entityArray_listInteger != entityJSON_listInteger; + } + +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java new file mode 100644 index 00000000..49211f97 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java @@ -0,0 +1,52 @@ +package org.hibernate.test; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.entities.EntityArray; +import org.hibernate.entities.EntityJSON; +import org.junit.Before; +import org.junit.Test; + +/** + * This template demonstrates how to develop a standalone test case for Hibernate ORM. Although this is perfectly + * acceptable as a reproducer, usage of ORMUnitTestCase is preferred! + */ +public class EntityJsonLoadedFirstTestCase { + + private Metadata metadata; + private SessionFactory sf; + + @Before + public void setup() { + StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder() + // Add in any settings that are specific to your test. See resources/hibernate.properties for the defaults. + .applySetting( "hibernate.show_sql", "true" ) + .applySetting( "hibernate.format_sql", "true" ) + .applySetting( "hibernate.hbm2ddl.auto", "update" ); + + metadata = new MetadataSources( srb.build() ) + // Add your entities here. + .addAnnotatedClass( EntityJSON.class ) + .addAnnotatedClass( EntityArray.class ) + .buildMetadata(); + + sf = metadata.buildSessionFactory(); + } + + // Add your tests, using standard JUnit. + @Test + public void hhh17680TestFailsForListString() throws Exception { + var entityArray_listString = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listString").getType(); + var entityJSON_listString = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listString").getType(); + assert entityArray_listString != entityJSON_listString; + } + + @Test + public void hhh17680TestFailsForListInteger() throws Exception { + var entityArray_listInteger = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listInteger").getType(); + var entityJSON_listInteger = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listInteger").getType(); + assert entityArray_listInteger != entityJSON_listInteger; + } +} From a82de1a3c7cb4e7c8dce96c0f5865d50b3364413 Mon Sep 17 00:00:00 2001 From: Chris Witteveen Date: Mon, 8 Jul 2024 17:36:03 +0200 Subject: [PATCH 2/2] Add entity without jdbctypecode --- .../org/hibernate/entities/EntityPlain.java | 45 +++++++++++ .../test/EntityArrayLoadedFirstTestCase.java | 44 ++++++++--- .../test/EntityJsonLoadedFirstTestCase.java | 44 ++++++++--- .../test/EntityPlainLoadedFirstTestCase.java | 79 +++++++++++++++++++ 4 files changed, 194 insertions(+), 18 deletions(-) create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityPlain.java create mode 100644 orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityPlainLoadedFirstTestCase.java diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityPlain.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityPlain.java new file mode 100644 index 00000000..9c7c919b --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/entities/EntityPlain.java @@ -0,0 +1,45 @@ +package org.hibernate.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.List; + +@Entity +public class EntityPlain { + + @Id + @GeneratedValue + private long id; + + private List listString; + + private List listInteger; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public List getListString() { + return listString; + } + + public void setListString(List listA) { + this.listString = listA; + } + + public List getListInteger() { + return listInteger; + } + + public void setListInteger(List listB) { + this.listInteger = listB; + } +} diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java index 2660d374..4949fff3 100644 --- a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityArrayLoadedFirstTestCase.java @@ -6,6 +6,10 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.entities.EntityArray; import org.hibernate.entities.EntityJSON; +import org.hibernate.entities.EntityPlain; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.type.Type; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -30,6 +34,7 @@ public void setup() { // Add your entities here. .addAnnotatedClass( EntityArray.class ) .addAnnotatedClass( EntityJSON.class ) + .addAnnotatedClass( EntityPlain.class ) .buildMetadata(); sf = metadata.buildSessionFactory(); @@ -37,17 +42,38 @@ public void setup() { // Add your tests, using standard JUnit. @Test - public void hhh17680TestSucceedsForListString() throws Exception { - var entityArray_listString = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listString").getType(); - var entityJSON_listString = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listString").getType(); - assert entityArray_listString != entityJSON_listString; + public void hhh17680Test() throws Exception { + var modelEntityArray = metadata.getEntityBinding(EntityArray.class.getName()); + var modelEntityJson = metadata.getEntityBinding(EntityJSON.class.getName()); + var modelEntityPlain = metadata.getEntityBinding(EntityPlain.class.getName()); + + // Entities with JdbcTypes JSON and ARRAY should have different types + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityJson, "listString") + ); + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityJson, "listInteger") + ); + + // + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityPlain, "listString") + ); + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityPlain, "listInteger") + ); } - @Test - public void hhh17680TestSucceedsForListInteger() throws Exception { - var entityArray_listInteger = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listInteger").getType(); - var entityJSON_listInteger = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listInteger").getType(); - assert entityArray_listInteger != entityJSON_listInteger; + private Type getPropertyType(PersistentClass model, String property) { + return model.getProperty(property).getType(); } } diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java index 49211f97..4a6c865a 100644 --- a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityJsonLoadedFirstTestCase.java @@ -6,6 +6,10 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.entities.EntityArray; import org.hibernate.entities.EntityJSON; +import org.hibernate.entities.EntityPlain; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.type.Type; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -30,6 +34,7 @@ public void setup() { // Add your entities here. .addAnnotatedClass( EntityJSON.class ) .addAnnotatedClass( EntityArray.class ) + .addAnnotatedClass( EntityPlain.class ) .buildMetadata(); sf = metadata.buildSessionFactory(); @@ -37,16 +42,37 @@ public void setup() { // Add your tests, using standard JUnit. @Test - public void hhh17680TestFailsForListString() throws Exception { - var entityArray_listString = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listString").getType(); - var entityJSON_listString = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listString").getType(); - assert entityArray_listString != entityJSON_listString; + public void hhh17680Test() throws Exception { + var modelEntityArray = metadata.getEntityBinding(EntityArray.class.getName()); + var modelEntityJson = metadata.getEntityBinding(EntityJSON.class.getName()); + var modelEntityPlain = metadata.getEntityBinding(EntityPlain.class.getName()); + + // Entities with JdbcTypes JSON and ARRAY should have different types + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityJson, "listString") + ); + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityJson, "listInteger") + ); + + // + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityPlain, "listString") + ); + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityPlain, "listInteger") + ); } - @Test - public void hhh17680TestFailsForListInteger() throws Exception { - var entityArray_listInteger = metadata.getEntityBinding(EntityArray.class.getName()).getProperty("listInteger").getType(); - var entityJSON_listInteger = metadata.getEntityBinding(EntityJSON.class.getName()).getProperty("listInteger").getType(); - assert entityArray_listInteger != entityJSON_listInteger; + private Type getPropertyType(PersistentClass model, String property) { + return model.getProperty(property).getType(); } } diff --git a/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityPlainLoadedFirstTestCase.java b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityPlainLoadedFirstTestCase.java new file mode 100644 index 00000000..44c02f54 --- /dev/null +++ b/orm/hibernate-orm-6/src/test/java/org/hibernate/test/EntityPlainLoadedFirstTestCase.java @@ -0,0 +1,79 @@ +package org.hibernate.test; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.entities.EntityArray; +import org.hibernate.entities.EntityJSON; +import org.hibernate.entities.EntityPlain; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.type.Type; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * This template demonstrates how to develop a standalone test case for Hibernate ORM. Although this is perfectly + * acceptable as a reproducer, usage of ORMUnitTestCase is preferred! + */ +public class EntityPlainLoadedFirstTestCase { + + private Metadata metadata; + private SessionFactory sf; + + @Before + public void setup() { + StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder() + // Add in any settings that are specific to your test. See resources/hibernate.properties for the defaults. + .applySetting( "hibernate.show_sql", "true" ) + .applySetting( "hibernate.format_sql", "true" ) + .applySetting( "hibernate.hbm2ddl.auto", "update" ); + + metadata = new MetadataSources( srb.build() ) + // Add your entities here. + .addAnnotatedClass( EntityPlain.class ) + .addAnnotatedClass( EntityJSON.class ) + .addAnnotatedClass( EntityArray.class ) + .buildMetadata(); + + sf = metadata.buildSessionFactory(); + } + + // Add your tests, using standard JUnit. + @Test + public void hhh17680Test() throws Exception { + var modelEntityArray = metadata.getEntityBinding(EntityArray.class.getName()); + var modelEntityJson = metadata.getEntityBinding(EntityJSON.class.getName()); + var modelEntityPlain = metadata.getEntityBinding(EntityPlain.class.getName()); + + // Entities with JdbcTypes JSON and ARRAY should have different types + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityJson, "listString") + ); + Assert.assertNotEquals( + "Entity with JdbcType ARRAY and entity with JdbcType JSON should have the different types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityJson, "listInteger") + ); + + // + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listString"), + getPropertyType(modelEntityPlain, "listString") + ); + Assert.assertEquals( + "Entity with JdbcType ARRAY and entity without JdbcType should have the same types", + getPropertyType(modelEntityArray, "listInteger"), + getPropertyType(modelEntityPlain, "listInteger") + ); + } + + private Type getPropertyType(PersistentClass model, String property) { + return model.getProperty(property).getType(); + } + +}