From f2434ca24b3581e4572708f4fe73b431afea4c59 Mon Sep 17 00:00:00 2001 From: Kirill Kurdyukov Date: Fri, 8 Nov 2024 17:29:18 +0300 Subject: [PATCH 1/4] feat: prepare hibernate release --- hibernate-dialect/CHANGELOG.md | 4 ++++ hibernate-dialect/pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hibernate-dialect/CHANGELOG.md b/hibernate-dialect/CHANGELOG.md index 87c003e..e7ec4e7 100644 --- a/hibernate-dialect/CHANGELOG.md +++ b/hibernate-dialect/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.0 ## + +- Added custom decimal jdbc codes `DECIMAL_31_9`, `DECIMAL_35_0`, `DECIMAL_35_9` + ## 1.1.0 ## - Added hint for scan queries diff --git a/hibernate-dialect/pom.xml b/hibernate-dialect/pom.xml index 3c8e9d7..9d39fba 100644 --- a/hibernate-dialect/pom.xml +++ b/hibernate-dialect/pom.xml @@ -6,7 +6,7 @@ tech.ydb.dialects hibernate-ydb-dialect - 1.1.0 + 1.2.0 jar From 82dee060b9e283b5443ea86c8b9f582a1a467883 Mon Sep 17 00:00:00 2001 From: Kirill Kurdyukov Date: Mon, 11 Nov 2024 13:38:59 +0300 Subject: [PATCH 2/4] feat: added support UUID YDB type --- hibernate-dialect/CHANGELOG.md | 4 ++++ hibernate-dialect/pom.xml | 2 +- .../tech/ydb/hibernate/dialect/YdbDialect.java | 15 +++++++++++---- .../java/tech/ydb/hibernate/types/Employee.java | 3 +++ .../tech/ydb/hibernate/types/TypesTest.java | 17 ++++++++++++++++- .../test/java/tech/ydb/hibernate/user/User.java | 5 ++--- .../ydb/hibernate/user/UserRepositoryTest.java | 6 +----- 7 files changed, 38 insertions(+), 14 deletions(-) diff --git a/hibernate-dialect/CHANGELOG.md b/hibernate-dialect/CHANGELOG.md index e7ec4e7..2d7aad6 100644 --- a/hibernate-dialect/CHANGELOG.md +++ b/hibernate-dialect/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0 ## + +- Added support UUID YDB type + ## 1.2.0 ## - Added custom decimal jdbc codes `DECIMAL_31_9`, `DECIMAL_35_0`, `DECIMAL_35_9` diff --git a/hibernate-dialect/pom.xml b/hibernate-dialect/pom.xml index 9d39fba..09e2c52 100644 --- a/hibernate-dialect/pom.xml +++ b/hibernate-dialect/pom.xml @@ -6,7 +6,7 @@ tech.ydb.dialects hibernate-ydb-dialect - 1.2.0 + 1.3.0 jar diff --git a/hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java b/hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java index cd123a2..db2a91e 100644 --- a/hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java +++ b/hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java @@ -49,10 +49,13 @@ import static org.hibernate.type.SqlTypes.TIMESTAMP_WITH_TIMEZONE; import static org.hibernate.type.SqlTypes.TIME_WITH_TIMEZONE; import static org.hibernate.type.SqlTypes.TINYINT; +import static org.hibernate.type.SqlTypes.UUID; import static org.hibernate.type.SqlTypes.VARBINARY; import static org.hibernate.type.SqlTypes.VARCHAR; import org.hibernate.type.StandardBasicTypes; +import org.hibernate.type.descriptor.java.UUIDJavaType; import org.hibernate.type.descriptor.jdbc.JdbcType; +import org.hibernate.type.descriptor.jdbc.UUIDJdbcType; import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry; import org.hibernate.type.descriptor.sql.internal.DdlTypeImpl; import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry; @@ -111,6 +114,7 @@ protected String columnType(int sqlTypeCode) { LONG32VARCHAR, LONG32NVARCHAR, LONGVARCHAR, LONGNVARCHAR -> "Text"; case BINARY, VARBINARY, BLOB, LONGVARBINARY, LONG32VARBINARY -> "Bytes"; case JSON -> "Json"; + case UUID, YdbJdbcCode.UUID -> "Uuid"; default -> super.columnType(sqlTypeCode); }; } @@ -119,20 +123,22 @@ protected String columnType(int sqlTypeCode) { public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { super.contributeTypes(typeContributions, serviceRegistry); + typeContributions.contributeJavaType(UUIDJavaType.INSTANCE); + typeContributions.contributeJdbcType(UUIDJdbcType.INSTANCE); typeContributions.contributeJavaType(LocalDateTimeJavaType.INSTANCE); typeContributions.contributeJdbcType(LocalDateTimeJdbcType.INSTANCE); typeContributions.contributeJavaType(LocalDateJavaType.INSTANCE); typeContributions.contributeJdbcType(LocalDateJdbcType.INSTANCE); typeContributions.contributeJavaType(InstantJavaType.INSTANCE); typeContributions.contributeJdbcType(InstantJdbcType.INSTANCE); - typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_22_9)); - typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_31_9)); - typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_35_0)); - typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_35_9)); // custom jdbc codec typeContributions.contributeJdbcType(Uint8JdbcType.INSTANCE); typeContributions.contributeJavaType(BigDecimalJavaType.INSTANCE_22_9); + typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_22_9)); + typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_31_9)); + typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_35_0)); + typeContributions.contributeJdbcType(new DecimalJdbcType(YdbJdbcCode.DECIMAL_35_9)); } @Override @@ -141,6 +147,7 @@ protected void registerColumnTypes(TypeContributions typeContributions, ServiceR final DdlTypeRegistry ddlTypeRegistry = typeContributions.getTypeConfiguration().getDdlTypeRegistry(); + ddlTypeRegistry.addDescriptor(new DdlTypeImpl(UUID, "Uuid", "Uuid", this)); ddlTypeRegistry.addDescriptor(new DdlTypeImpl(YdbJdbcCode.DATETIME, "Datetime", "Datetime", this)); ddlTypeRegistry.addDescriptor(new DdlTypeImpl(YdbJdbcCode.UINT8, "Uint8", "Uint8", this)); ddlTypeRegistry.addDescriptor(new DdlTypeImpl(YdbJdbcCode.DECIMAL_22_9, "Decimal(22, 9)", "Decimal(22, 9)", this)); diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/Employee.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/Employee.java index f6aed09..12dafce 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/Employee.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/Employee.java @@ -9,6 +9,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -59,6 +60,8 @@ public class Employee { @Enumerated(EnumType.STRING) private Enum bnEnum; + private UUID uuid; + public enum Enum { ONE, TWO } diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java index ee39eed..79aa68b 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java @@ -3,6 +3,8 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; import org.hibernate.cfg.AvailableSettings; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeAll; @@ -44,7 +46,8 @@ void integrationTypesTest() { LocalDateTime.parse("2023-09-16T12:30:00"), new byte[]{1, 2, 3, 4, 5}, Employee.Enum.ONE, - Employee.Enum.TWO + Employee.Enum.TWO, + UUID.randomUUID() ); inTransaction(session -> session.persist(employee)); @@ -57,5 +60,17 @@ void integrationTypesTest() { inTransaction(session -> assertEquals(employee, session .createQuery("FROM Employee e WHERE e.isActive = false", Employee.class) .getSingleResult())); + + List uuids = List.of( + "123e4567-e89b-12d3-a456-426614174000", + "2d9e498b-b746-9cfb-084d-de4e1cb4736e", + "6E73B41C-4EDE-4D08-9CFB-B7462D9E498B" + ); + + for (var uuid : uuids) { + employee.setUuid(UUID.fromString(uuid)); + inTransaction(session -> session.merge(employee)); + inTransaction(session -> assertEquals(employee, session.find(Employee.class, employee.getId()))); + } } } diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/User.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/User.java index 9bb7412..c623784 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/User.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/User.java @@ -5,6 +5,8 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.time.Instant; +import java.util.concurrent.ThreadLocalRandom; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.GenericGenerator; @@ -14,9 +16,6 @@ import org.hibernate.id.IdentifierGenerator; import org.hibernate.type.SqlTypes; -import java.time.Instant; -import java.util.concurrent.ThreadLocalRandom; - /** * @author Kirill Kurdyukov */ diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/UserRepositoryTest.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/UserRepositoryTest.java index 8bd851b..9194b89 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/UserRepositoryTest.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/user/UserRepositoryTest.java @@ -46,22 +46,18 @@ void integrationTest() { user.setJson(json); inTransaction(session -> session.persist(user)); - inTransaction( session -> { User findUser = session.find(User.class, user.getId()); assertEquals("Kirill", findUser.getName()); assertEquals(json, findUser.getJson()); - assertTrue(Instant.now().compareTo(findUser.getCreatedAt()) >= 0); assertTrue(Instant.now().compareTo(findUser.getUpdatedAt()) >= 0); } ); User rollbackUser = new User(); - - user.setId(10); user.setName("Kirill"); try { @@ -73,7 +69,7 @@ void integrationTest() { } catch (RuntimeException ignored) { } - inTransaction(session -> assertNull(session.find(User.class, 10))); + inTransaction(session -> assertNull(session.find(User.class, rollbackUser.getId()))); } @Test From 884f9a534cd825efaf6dcc15a53fd9505236c244 Mon Sep 17 00:00:00 2001 From: Kirill Kurdyukov Date: Mon, 11 Nov 2024 13:41:38 +0300 Subject: [PATCH 3/4] feat: added support UUID YDB type --- .../src/test/java/tech/ydb/hibernate/types/TypesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java index 79aa68b..32dcdef 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java @@ -28,7 +28,7 @@ public class TypesTest { static void beforeAll() { TestUtils.SESSION_FACTORY = basedConfiguration() .addAnnotatedClass(Employee.class) - .setProperty(AvailableSettings.URL, jdbcUrl(ydb)) + .setProperty(AvailableSettings.URL, jdbcUrl(ydb) + "?disablePrepareDataQuery=true") .buildSessionFactory(); } From c4a77eba211ea9efe1e592960e5c4214ad67ed6e Mon Sep 17 00:00:00 2001 From: Kirill Kurdyukov Date: Mon, 11 Nov 2024 13:45:36 +0300 Subject: [PATCH 4/4] feat: added support UUID YDB type --- .../src/test/java/tech/ydb/hibernate/types/TypesTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java index 32dcdef..fb0ee54 100644 --- a/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java +++ b/hibernate-dialect/src/test/java/tech/ydb/hibernate/types/TypesTest.java @@ -70,7 +70,12 @@ void integrationTypesTest() { for (var uuid : uuids) { employee.setUuid(UUID.fromString(uuid)); inTransaction(session -> session.merge(employee)); - inTransaction(session -> assertEquals(employee, session.find(Employee.class, employee.getId()))); + inTransaction(session -> { + var actualEmployee = session.find(Employee.class, employee.getId()); + + assertEquals(employee, actualEmployee); + assertEquals(uuid.toLowerCase(), actualEmployee.getUuid().toString()); + }); } } }