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..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
@@ -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;
@@ -26,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();
}
@@ -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,22 @@ 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 -> {
+ var actualEmployee = session.find(Employee.class, employee.getId());
+
+ assertEquals(employee, actualEmployee);
+ assertEquals(uuid.toLowerCase(), actualEmployee.getUuid().toString());
+ });
+ }
}
}
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