diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java index af640780f4a7..d892cf29efc1 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java @@ -507,6 +507,11 @@ public boolean supportsInsertReturningGeneratedKeys() { return true; } + @Override + public int getDoublePrecision() { + return 38; + } + /** * type or {@link Types#TIME} type, and its default behavior * for casting dates and timestamps to and from strings is just awful. diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java index 46d3de5b485b..dbf3350de4eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java @@ -346,6 +346,11 @@ public int getMaxIdentifierLength() { return 128; } + @Override + public int getDoublePrecision() { + return 38; + } + @Override public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { super.contributeTypes( typeContributions, serviceRegistry ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/secondarytable/MergeCastNumericTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/secondarytable/MergeCastNumericTest.java new file mode 100644 index 000000000000..e6e981519faa --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/secondarytable/MergeCastNumericTest.java @@ -0,0 +1,66 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.secondarytable; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.SecondaryTable; +import jakarta.persistence.Table; +import org.hibernate.annotations.JdbcType; +import org.hibernate.dialect.OracleDialect; +import org.hibernate.dialect.SQLServerDialect; +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.type.descriptor.jdbc.NumericJdbcType; +import org.junit.jupiter.api.Test; + +@Jpa( + annotatedClasses = {MergeCastNumericTest.Actor.class}, + integrationSettings = { + @Setting(name = org.hibernate.cfg.AvailableSettings.SHOW_SQL, value = "true"), + } +) +@JiraKey("HHH-19749") +@RequiresDialect(OracleDialect.class) +@RequiresDialect(SQLServerDialect.class) +class MergeCastNumericTest { + + @Test + void test(EntityManagerFactoryScope scope) { + scope.inTransaction( + entityManager -> { + Actor actor = new Actor(); + actor.salary = 5000.77d; + + entityManager.persist( actor ); + entityManager.flush(); + entityManager.clear(); + + actor = entityManager.find( Actor.class, actor.id ); + actor.salary = 5000.88d; + + entityManager.flush(); + entityManager.clear(); + } + ); + } + + @Entity(name = "actor") + @Table(name = "PRINCIPAL") + @SecondaryTable(name = "SECONDARY") + public static class Actor { + @Id + @GeneratedValue + private Long id; + @Column(table = "SECONDARY", precision = 6, scale = 2) + @JdbcType(NumericJdbcType.class) + private double salary; + } +}