From bf3b0d4fe9ef5629cdb3149f32b42e4ee0ea6bb5 Mon Sep 17 00:00:00 2001 From: Adrien Ferrand Date: Mon, 8 Jan 2024 09:41:38 +0100 Subject: [PATCH] HBX-2716 - Remove floating point types from types advertised to support precision & scale Signed-off-by: Koen Aers --- src/java/org/hibernate/cfg/JDBCBinder.java | 4 +- .../cfg/reveng/BasicColumnProcessor.java | 6 +- .../DefaultReverseEngineeringStrategy.java | 4 +- ...er.java => JdbcToHibernateTypeHelper.java} | 86 ++++++++++--------- .../hibernate/cfg/reveng/OverrideBinder.java | 4 +- .../cfg/reveng/OverrideRepository.java | 2 +- .../detector/SchemaByMetaDataDetector.java | 4 +- 7 files changed, 59 insertions(+), 51 deletions(-) rename src/java/org/hibernate/cfg/reveng/{JDBCToHibernateTypeHelper.java => JdbcToHibernateTypeHelper.java} (54%) diff --git a/src/java/org/hibernate/cfg/JDBCBinder.java b/src/java/org/hibernate/cfg/JDBCBinder.java index 3330e3d24e..dad1fb5dbd 100644 --- a/src/java/org/hibernate/cfg/JDBCBinder.java +++ b/src/java/org/hibernate/cfg/JDBCBinder.java @@ -30,7 +30,7 @@ import org.hibernate.cfg.reveng.AssociationInfo; import org.hibernate.cfg.reveng.DatabaseCollector; import org.hibernate.cfg.reveng.JDBCReader; -import org.hibernate.cfg.reveng.JDBCToHibernateTypeHelper; +import org.hibernate.cfg.reveng.JdbcToHibernateTypeHelper; import org.hibernate.cfg.reveng.MappingsDatabaseCollector; import org.hibernate.cfg.reveng.RevEngUtils; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; @@ -933,7 +933,7 @@ private String guessAndAlignType(Table table, Column column, Mapping mapping, bo } private String typeCodeName(int sqlTypeCode) { - return sqlTypeCode + "(" + JDBCToHibernateTypeHelper.getJDBCTypeName(sqlTypeCode) + ")"; + return sqlTypeCode + "(" + JdbcToHibernateTypeHelper.getJDBCTypeName(sqlTypeCode) + ")"; } /** diff --git a/src/java/org/hibernate/cfg/reveng/BasicColumnProcessor.java b/src/java/org/hibernate/cfg/reveng/BasicColumnProcessor.java index e3a87fd0cd..e972b7b221 100644 --- a/src/java/org/hibernate/cfg/reveng/BasicColumnProcessor.java +++ b/src/java/org/hibernate/cfg/reveng/BasicColumnProcessor.java @@ -82,15 +82,15 @@ public static void processBasicColumns( column.setComment(comment); column.setSqlTypeCode(new Integer(sqlType) ); if(intBounds(size) ) { - if(JDBCToHibernateTypeHelper.typeHasLength(sqlType) ) { + if(JdbcToHibernateTypeHelper.typeHasLength(sqlType) ) { column.setLength(size); } - if(JDBCToHibernateTypeHelper.typeHasScaleAndPrecision(sqlType) ) { + if(JdbcToHibernateTypeHelper.typeHasPrecision(sqlType) ) { column.setPrecision(size); } } if(intBounds(decimalDigits) ) { - if(JDBCToHibernateTypeHelper.typeHasScaleAndPrecision(sqlType) ) { + if(JdbcToHibernateTypeHelper.typeHasScale(sqlType) ) { column.setScale(decimalDigits); } } diff --git a/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java b/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java index 8805261f3e..5349077eb0 100644 --- a/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java +++ b/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java @@ -105,11 +105,11 @@ public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, } public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale, boolean nullable, boolean generatedIdentifier) { - String preferredHibernateType = JDBCToHibernateTypeHelper.getPreferredHibernateType(sqlType, length, precision, scale, nullable, generatedIdentifier); + String preferredHibernateType = JdbcToHibernateTypeHelper.getPreferredHibernateType(sqlType, length, precision, scale, nullable, generatedIdentifier); String location = ""; if(log.isDebugEnabled()) { - String info = " t:" + JDBCToHibernateTypeHelper.getJDBCTypeName( sqlType ) + " l:" + length + " p:" + precision + " s:" + scale + " n:" + nullable + " id:" + generatedIdentifier; + String info = " t:" + JdbcToHibernateTypeHelper.getJDBCTypeName( sqlType ) + " l:" + length + " p:" + precision + " s:" + scale + " n:" + nullable + " id:" + generatedIdentifier; if(table!=null) { location = TableNameQualifier.qualify(table.getCatalog(), table.getSchema(), table.getName() ) + "." + columnName + info; } else { diff --git a/src/java/org/hibernate/cfg/reveng/JDBCToHibernateTypeHelper.java b/src/java/org/hibernate/cfg/reveng/JdbcToHibernateTypeHelper.java similarity index 54% rename from src/java/org/hibernate/cfg/reveng/JDBCToHibernateTypeHelper.java rename to src/java/org/hibernate/cfg/reveng/JdbcToHibernateTypeHelper.java index f921e1187f..bbbd4daffe 100644 --- a/src/java/org/hibernate/cfg/reveng/JDBCToHibernateTypeHelper.java +++ b/src/java/org/hibernate/cfg/reveng/JdbcToHibernateTypeHelper.java @@ -16,9 +16,9 @@ * @author max (based on parts from Sql2Java from Middlegen) * */ -public final class JDBCToHibernateTypeHelper { +public final class JdbcToHibernateTypeHelper { - private JDBCToHibernateTypeHelper() { + private JdbcToHibernateTypeHelper() { } @@ -26,28 +26,28 @@ private JDBCToHibernateTypeHelper() { private static final Map PREFERRED_HIBERNATETYPE_FOR_SQLTYPE = new HashMap(); static { - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.TINYINT), new String[] { "byte", Byte.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.SMALLINT), new String[] { "short", Short.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.INTEGER), new String[] { "int", Integer.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.BIGINT), new String[] { "long", Long.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.REAL), new String[] { "float", Float.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.FLOAT), new String[] { "double", Double.class.getName()} ); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.DOUBLE), new String[] { "double", Double.class.getName()}); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.DECIMAL), new String[] { "big_decimal", "big_decimal" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.NUMERIC), new String[] { "big_decimal", "big_decimal" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.BIT), new String[] { "boolean", Boolean.class.getName()}); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.BOOLEAN), new String[] { "boolean", Boolean.class.getName()}); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.CHAR), new String[] { "char", Character.class.getName()}); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.VARCHAR), new String[] { "string", "string" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.LONGVARCHAR), new String[] { "string", "string" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.BINARY), new String[] { "binary", "binary" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.VARBINARY), new String[] { "binary", "binary" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.LONGVARBINARY), new String[] { "binary", "binary" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.DATE), new String[] { "date", "date" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.TIME), new String[] { "time", "time" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.TIMESTAMP), new String[] { "timestamp", "timestamp" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.CLOB), new String[] { "clob", "clob" }); - PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(new Integer(Types.BLOB), new String[] { "blob", "blob" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.TINYINT), new String[] { "byte", Byte.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.SMALLINT), new String[] { "short", Short.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.INTEGER), new String[] { "int", Integer.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.BIGINT), new String[] { "long", Long.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.REAL), new String[] { "float", Float.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.FLOAT), new String[] { "double", Double.class.getName()} ); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.DOUBLE), new String[] { "double", Double.class.getName()}); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.DECIMAL), new String[] { "big_decimal", "big_decimal" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.NUMERIC), new String[] { "big_decimal", "big_decimal" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.BIT), new String[] { "boolean", Boolean.class.getName()}); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.BOOLEAN), new String[] { "boolean", Boolean.class.getName()}); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.CHAR), new String[] { "char", Character.class.getName()}); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.VARCHAR), new String[] { "string", "string" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.LONGVARCHAR), new String[] { "string", "string" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.BINARY), new String[] { "binary", "binary" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.VARBINARY), new String[] { "binary", "binary" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.LONGVARBINARY), new String[] { "binary", "binary" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.DATE), new String[] { "date", "date" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.TIME), new String[] { "time", "time" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.TIMESTAMP), new String[] { "timestamp", "timestamp" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.CLOB), new String[] { "clob", "clob" }); + PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.put(Integer.valueOf(Types.BLOB), new String[] { "blob", "blob" }); //Hibernate does not have any built-in Type for these: //preferredJavaTypeForSqlType.put(new Integer(Types.ARRAY), "java.sql.Array"); @@ -87,7 +87,7 @@ else if (precision < 19) { return "string"; } - String[] result = (String[]) PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.get(new Integer(sqlType) ); + String[] result = (String[]) PREFERRED_HIBERNATETYPE_FOR_SQLTYPE.get(Integer.valueOf(sqlType) ); if(result==null) { return null; @@ -166,7 +166,7 @@ public static String getJDBCTypeName(int value) { } } - String name = (String) jdbcTypeValues.get(new Integer(value) ); + String name = (String) jdbcTypeValues.get(Integer.valueOf(value) ); if(name!=null) { return name; @@ -183,17 +183,25 @@ public static String getJDBCTypeName(int value) { * @throws SQLException */ - // scale and precision have numeric column - public static boolean typeHasScaleAndPrecision(int sqlType) { - return (sqlType == Types.DECIMAL || sqlType == Types.NUMERIC - || sqlType == Types.REAL || sqlType == Types.FLOAT || sqlType == Types.DOUBLE); - } - - // length is for string column - public static boolean typeHasLength(int sqlType) { - return (sqlType == Types.CHAR || sqlType == Types.DATE - || sqlType == Types.LONGVARCHAR || sqlType == Types.TIME || sqlType == Types.TIMESTAMP - || sqlType == Types.VARCHAR ); - } -} + // scale is for non floating point numeric columns + public static boolean typeHasScale(int sqlType) { + return (sqlType == Types.DECIMAL || sqlType == Types.NUMERIC); + } + + // precision is for numeric columns + public static boolean typeHasPrecision(int sqlType) { + return (sqlType == Types.DECIMAL || sqlType == Types.NUMERIC + || sqlType == Types.REAL || sqlType == Types.FLOAT || sqlType == Types.DOUBLE); + } + public static boolean typeHasScaleAndPrecision(int sqlType) { + return typeHasScale(sqlType) && typeHasPrecision(sqlType); + } + + // length is for string columns + public static boolean typeHasLength(int sqlType) { + return (sqlType == Types.CHAR || sqlType == Types.DATE + || sqlType == Types.LONGVARCHAR || sqlType == Types.TIME || sqlType == Types.TIMESTAMP + || sqlType == Types.VARCHAR ); + } +} diff --git a/src/java/org/hibernate/cfg/reveng/OverrideBinder.java b/src/java/org/hibernate/cfg/reveng/OverrideBinder.java index d9ce82a6ff..d563f7655e 100644 --- a/src/java/org/hibernate/cfg/reveng/OverrideBinder.java +++ b/src/java/org/hibernate/cfg/reveng/OverrideBinder.java @@ -315,7 +315,7 @@ private static List bindColumns(List columns, Table table, OverrideRe column.setName( element.attributeValue("name") ); String attributeValue = element.attributeValue("jdbc-type"); if(StringHelper.isNotEmpty(attributeValue)) { - column.setSqlTypeCode(new Integer(JDBCToHibernateTypeHelper.getJDBCType(attributeValue))); + column.setSqlTypeCode(new Integer(JdbcToHibernateTypeHelper.getJDBCType(attributeValue))); } TableIdentifier tableIdentifier = TableIdentifier.create(table); @@ -408,7 +408,7 @@ private static void bindTypeMappings(Element typeMapping, OverrideRepository rep while (iterator.hasNext() ) { Element element = (Element) iterator.next(); - int jdbcType = JDBCToHibernateTypeHelper.getJDBCType(element.attributeValue("jdbc-type") ); + int jdbcType = JdbcToHibernateTypeHelper.getJDBCType(element.attributeValue("jdbc-type") ); SQLTypeMapping mapping = new SQLTypeMapping(jdbcType ); mapping.setHibernateType( getHibernateType( element ) ); mapping.setLength(getInteger(element.attributeValue("length"), SQLTypeMapping.UNKNOWN_LENGTH) ); diff --git a/src/java/org/hibernate/cfg/reveng/OverrideRepository.java b/src/java/org/hibernate/cfg/reveng/OverrideRepository.java index abde9e0934..c37d4ee8ad 100644 --- a/src/java/org/hibernate/cfg/reveng/OverrideRepository.java +++ b/src/java/org/hibernate/cfg/reveng/OverrideRepository.java @@ -311,7 +311,7 @@ public List getSchemaSelections() { public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale, boolean nullable, boolean generatedIdentifier) { String result = null; String location = ""; - String info = " t:" + JDBCToHibernateTypeHelper.getJDBCTypeName( sqlType ) + " l:" + length + " p:" + precision + " s:" + scale + " n:" + nullable + " id:" + generatedIdentifier; + String info = " t:" + JdbcToHibernateTypeHelper.getJDBCTypeName( sqlType ) + " l:" + length + " p:" + precision + " s:" + scale + " n:" + nullable + " id:" + generatedIdentifier; if(table!=null) { location = TableNameQualifier.qualify(table.getCatalog(), table.getSchema(), table.getName() ) + "." + columnName; } else { diff --git a/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java b/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java index d9074051ed..520ba5e7c2 100644 --- a/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java +++ b/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java @@ -18,7 +18,7 @@ import org.hibernate.cfg.reveng.DefaultDatabaseCollector; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.JDBCReader; -import org.hibernate.cfg.reveng.JDBCToHibernateTypeHelper; +import org.hibernate.cfg.reveng.JdbcToHibernateTypeHelper; import org.hibernate.cfg.reveng.SchemaSelection; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.spi.JdbcServices; @@ -200,7 +200,7 @@ public void visit( pc.reportIssue( new Issue( "SCHEMA_COLUMN_TYPE_MISMATCH", Issue.NORMAL_PRIORITY, table(table) + " has a wrong column type for " + col.getName() + ", expected: " - + JDBCToHibernateTypeHelper.getJDBCTypeName(modelTypeCode) + " but was " + JDBCToHibernateTypeHelper.getJDBCTypeName(dbTypeCode) + " in db") ); + + JdbcToHibernateTypeHelper.getJDBCTypeName(modelTypeCode) + " but was " + JdbcToHibernateTypeHelper.getJDBCTypeName(dbTypeCode) + " in db") ); } } }