From 3de21da5633a20932f45dec4adcdd93bbd7114f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Cedomir=20Igaly?= Date: Wed, 4 Dec 2024 11:34:46 +0100 Subject: [PATCH 1/2] HHH-18869 Test case for Jira issue https://hibernate.atlassian.net/browse/HHH-18869 --- .../MariaDbJsonColumnValidationTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/schemavalidation/MariaDbJsonColumnValidationTest.java diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemavalidation/MariaDbJsonColumnValidationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemavalidation/MariaDbJsonColumnValidationTest.java new file mode 100644 index 000000000000..aedfb618b470 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemavalidation/MariaDbJsonColumnValidationTest.java @@ -0,0 +1,62 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.schemavalidation; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.hibernate.dialect.MariaDBDialect; +import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.tool.hbm2ddl.SchemaValidator; +import org.junit.Before; +import org.junit.Test; + +import java.math.BigDecimal; + +@JiraKey(value = "HHH-18869") +@RequiresDialect(value = MariaDBDialect.class) +public class MariaDbJsonColumnValidationTest extends BaseNonConfigCoreFunctionalTestCase { + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] {Foo.class}; + } + + @Before + public void init() { + try { + inTransaction( session -> { + try { + session.createNativeMutationQuery( "drop table Foo" ).executeUpdate(); + } + catch (Exception e) { + throw new RuntimeException( e ); + } + } + ); + inTransaction( session -> + session.createNativeMutationQuery( + "create table Foo (id integer not null, bigDecimals json, primary key (id)) engine=InnoDB" + ).executeUpdate() + ); + } + catch (Exception ignored) { + } + } + + @Test + public void testSchemaValidation() { + new SchemaValidator().validate( metadata() ); + } + + @Entity(name = "Foo") + @Table(name = "Foo") + public static class Foo { + @Id + public Integer id; + public BigDecimal[] bigDecimals; + } +} From 07aa8512ce70e727c57c6d63eb94dea507987229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Cedomir=20Igaly?= Date: Wed, 4 Dec 2024 11:35:26 +0100 Subject: [PATCH 2/2] HHH-18869 Override Dialect.equivalentTypes in MariaDBDialect to return true for JSON vs LONGTEXT See https://mariadb.com/kb/en/json-data-type/ --- .../main/java/org/hibernate/dialect/MariaDBDialect.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java index 66d36064cdcc..d712767fc707 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java @@ -6,6 +6,7 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; +import java.sql.Types; import org.hibernate.boot.model.FunctionContributions; import org.hibernate.boot.model.TypeContributions; @@ -313,4 +314,11 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, D public String getDual() { return "dual"; } + + @Override + public boolean equivalentTypes(int typeCode1, int typeCode2) { + return typeCode1 == Types.LONGVARCHAR && typeCode2 == SqlTypes.JSON + || typeCode1 == SqlTypes.JSON && typeCode2 == Types.LONGVARCHAR + || super.equivalentTypes( typeCode1, typeCode2 ); + } }