Skip to content

Commit dc8fc4e

Browse files
Merge remote-tracking branch 'origin/main'
2 parents ffa3115 + 4c9c4c7 commit dc8fc4e

File tree

13 files changed

+264
-19
lines changed

13 files changed

+264
-19
lines changed

hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.hibernate.boot.model.TypeContributions;
88
import org.hibernate.dialect.Dialect;
99
import org.hibernate.dialect.function.CurrentFunction;
10+
import org.hibernate.dialect.identity.IdentityColumnSupport;
1011
import org.hibernate.dialect.pagination.LimitHandler;
1112
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
1213
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
@@ -67,6 +68,7 @@
6768
import tech.ydb.hibernate.dialect.hint.PragmaQueryHintHandler;
6869
import tech.ydb.hibernate.dialect.hint.QueryHintHandler;
6970
import tech.ydb.hibernate.dialect.hint.ScanQueryHintHandler;
71+
import tech.ydb.hibernate.dialect.identity.YdbIdentityColumnSupport;
7072
import tech.ydb.hibernate.dialect.translator.YdbSqlAstTranslatorFactory;
7173
import tech.ydb.hibernate.dialect.types.BigDecimalJavaType;
7274
import tech.ydb.hibernate.dialect.types.DecimalJdbcType;
@@ -368,4 +370,19 @@ public Exporter<ForeignKey> getForeignKeyExporter() {
368370
public boolean supportsColumnCheck() {
369371
return false;
370372
}
373+
374+
@Override
375+
public IdentityColumnSupport getIdentityColumnSupport() {
376+
return YdbIdentityColumnSupport.INSTANCE;
377+
}
378+
379+
@Override
380+
public boolean supportsInsertReturning() {
381+
return true;
382+
}
383+
384+
@Override
385+
public boolean supportsInsertReturningGeneratedKeys() {
386+
return true;
387+
}
371388
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package tech.ydb.hibernate.dialect.identity;
2+
3+
import java.sql.JDBCType;
4+
import org.hibernate.MappingException;
5+
import org.hibernate.dialect.Dialect;
6+
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
7+
import org.hibernate.id.PostInsertIdentityPersister;
8+
import org.hibernate.id.insert.GetGeneratedKeysDelegate;
9+
import static org.hibernate.type.SqlTypes.BIGINT;
10+
import static org.hibernate.type.SqlTypes.INTEGER;
11+
import static org.hibernate.type.SqlTypes.SMALLINT;
12+
import static org.hibernate.type.SqlTypes.TINYINT;
13+
14+
/**
15+
* @author Kirill Kurdyukov
16+
*/
17+
public class YdbIdentityColumnSupport extends IdentityColumnSupportImpl {
18+
19+
public static final YdbIdentityColumnSupport INSTANCE = new YdbIdentityColumnSupport();
20+
21+
@Override
22+
public boolean hasDataTypeInIdentityColumn() {
23+
return false;
24+
}
25+
26+
@Override
27+
public String getIdentityColumnString(int type) throws MappingException {
28+
return switch (type) {
29+
case TINYINT, SMALLINT -> "SmallSerial";
30+
case INTEGER -> "Serial";
31+
case BIGINT -> "BigSerial";
32+
default -> throw new MappingException(
33+
"Ydb does not support identity key generation for sqlType: " + JDBCType.valueOf(type));
34+
};
35+
}
36+
37+
@Override
38+
public boolean supportsIdentityColumns() {
39+
return true;
40+
}
41+
42+
@Override
43+
public GetGeneratedKeysDelegate buildGetGeneratedKeysDelegate(
44+
PostInsertIdentityPersister persister,
45+
Dialect dialect
46+
) {
47+
return new GetGeneratedKeysDelegate(persister, dialect, false);
48+
}
49+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package tech.ydb.hibernate.auto_inc;
2+
3+
import org.hibernate.MappingException;
4+
import org.hibernate.cfg.AvailableSettings;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
import static tech.ydb.hibernate.TestUtils.SESSION_FACTORY;
8+
import static tech.ydb.hibernate.TestUtils.basedConfiguration;
9+
import static tech.ydb.hibernate.TestUtils.jdbcUrl;
10+
import tech.ydb.test.junit5.YdbHelperExtension;
11+
12+
/**
13+
* @author Kirill Kurdyukov
14+
*/
15+
public class GenerationTypeIdentityTest {
16+
17+
@RegisterExtension
18+
private static final YdbHelperExtension ydb = new YdbHelperExtension();
19+
20+
// @Test
21+
void serialTypesTest() {
22+
/*
23+
create table test_table_int_auto_inc (
24+
id Serial,
25+
text Text,
26+
primary key (id)
27+
)
28+
*/
29+
30+
SESSION_FACTORY = basedConfiguration()
31+
.addAnnotatedClass(TestEntityInt.class)
32+
.addAnnotatedClass(TestEntityLong.class)
33+
.addAnnotatedClass(TestEntityShort.class)
34+
.setProperty(AvailableSettings.URL, jdbcUrl(ydb))
35+
.buildSessionFactory();
36+
37+
Assertions.assertThrows(MappingException.class, () -> basedConfiguration()
38+
.addAnnotatedClass(TestEntityFail.class)
39+
.setProperty(AvailableSettings.URL, jdbcUrl(ydb))
40+
.buildSessionFactory());
41+
42+
SESSION_FACTORY.inTransaction(
43+
session -> {
44+
var intE = new TestEntityInt();
45+
intE.setText("test");
46+
session.persist(intE);
47+
var intS = new TestEntityShort();
48+
intS.setText("test");
49+
session.persist(intS);
50+
var intL = new TestEntityLong();
51+
intL.setText("test");
52+
session.persist(intL);
53+
}
54+
);
55+
}
56+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tech.ydb.hibernate.auto_inc;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* @author Kirill Kurdyukov
15+
*/
16+
@Entity
17+
@Data
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
@Table(name = "test_table_int_auto_fail")
21+
public class TestEntityFail {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private String id;
26+
27+
@Column
28+
private String text;
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tech.ydb.hibernate.auto_inc;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* @author Kirill Kurdyukov
15+
*/
16+
@Entity
17+
@Data
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
@Table(name = "test_table_int_auto_inc")
21+
public class TestEntityInt {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private int id;
26+
27+
@Column
28+
private String text;
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tech.ydb.hibernate.auto_inc;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* @author Kirill Kurdyukov
15+
*/
16+
@Entity
17+
@Data
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
@Table(name = "test_table_int_auto_long")
21+
public class TestEntityLong {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private long id;
26+
27+
@Column
28+
private String text;
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tech.ydb.hibernate.auto_inc;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
/**
14+
* @author Kirill Kurdyukov
15+
*/
16+
@Entity
17+
@Data
18+
@AllArgsConstructor
19+
@NoArgsConstructor
20+
@Table(name = "test_table_int_auto_short")
21+
public class TestEntityShort {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private short id;
26+
27+
@Column
28+
private String text;
29+
}

jooq-dialect/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
## 1.1.0 ##
2+
- Upgrade to new version of JDBC & SDK
3+
14
## 1.0.1 ##
25
- Fixed bug with `useIndex` - skip the table name (`from view`)
36

47
## 1.0.0 ##
58

6-
- `REPLACE` / `UPSERT` builders from YDB
9+
- `REPLACE` / `UPSERT` builders from YDB
710
- Supported VIEW INDEX from `useIndex("index_name")` HintedTable
811
- Generated tables from schema

jooq-dialect/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ydb-platform/ydb-java-dialects/blob/main/LICENSE.md)
2-
[![Maven metadata URL](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Ftech%2Fydb%2Fdialects%2Fhibernate-ydb-dialect-v5%2Fmaven-metadata.xml)](https://mvnrepository.com/artifact/tech.ydb.dialects/jooq-ydb-dialect)
2+
[![Maven metadata URL](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Frepo1.maven.org%2Fmaven2%2Ftech%2Fydb%2Fdialects%2Fjooq-ydb-dialect%2Fmaven-metadata.xml)](https://mvnrepository.com/artifact/tech.ydb.dialects/jooq-ydb-dialect)
33
[![CI](https://img.shields.io/github/actions/workflow/status/ydb-platform/ydb-java-dialects/ci-jooq-dialect.yaml?branch=main&label=CI)](https://github.com/ydb-platform/ydb-java-dialects/actions/workflows/ci-jooq-dialect.yaml)
44

55
# YDB JOOQ Dialect

jooq-dialect/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>tech.ydb.dialects</groupId>
66
<artifactId>jooq-ydb-dialect</artifactId>
7-
<version>1.0.1</version>
7+
<version>1.1.0</version>
88

99
<name>YDB JOOQ Dialect module</name>
1010
<description>YDB JOOQ Dialect module</description>
@@ -52,8 +52,8 @@
5252

5353
<jooq.version>3.19.0</jooq.version>
5454

55-
<ydb.sdk.version>2.2.6</ydb.sdk.version>
56-
<ydb.jdbc.version>2.2.3</ydb.jdbc.version>
55+
<ydb.sdk.version>2.3.8</ydb.sdk.version>
56+
<ydb.jdbc.version>2.3.7</ydb.jdbc.version>
5757
</properties>
5858

5959
<dependencies>

jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package tech.ydb.jooq.codegen;
22

3+
import java.math.BigDecimal;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
38
import org.jooq.*;
49
import org.jooq.impl.DSL;
510
import org.jooq.meta.*;
611
import org.jooq.tools.JooqLogger;
12+
713
import tech.ydb.jdbc.YdbConnection;
814
import tech.ydb.jdbc.context.SchemeExecutor;
915
import tech.ydb.jdbc.context.YdbContext;
@@ -17,11 +23,6 @@
1723
import tech.ydb.table.description.TableIndex;
1824
import tech.ydb.table.settings.DescribeTableSettings;
1925

20-
import java.math.BigDecimal;
21-
import java.util.ArrayList;
22-
import java.util.Collections;
23-
import java.util.List;
24-
2526
public class YdbDatabase extends AbstractDatabase implements ResultQueryDatabase {
2627
private static final JooqLogger log = JooqLogger.getLogger(YdbDatabase.class);
2728

@@ -39,7 +40,7 @@ private YdbContext getContext() {
3940
}
4041

4142
private String getDatabaseName() {
42-
return getContext().getDatabase().substring(1);
43+
return getContext().getPrefixPath().substring(1);
4344
}
4445

4546
@Override

jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.time.LocalDateTime;
77
import java.util.ArrayList;
88
import java.util.List;
9+
910
import org.jooq.Binding;
1011
import org.jooq.JSON;
1112
import org.jooq.JSONB;
@@ -20,7 +21,7 @@
2021
import org.jooq.types.UInteger;
2122
import org.jooq.types.ULong;
2223
import org.jooq.types.UShort;
23-
import tech.ydb.jdbc.YdbConst;
24+
2425
import tech.ydb.jdbc.impl.YdbTypes;
2526
import tech.ydb.jooq.binding.DateBinding;
2627
import tech.ydb.jooq.binding.DatetimeBinding;
@@ -36,6 +37,7 @@
3637
import tech.ydb.jooq.value.YSON;
3738
import tech.ydb.table.description.TableColumn;
3839
import tech.ydb.table.description.TableDescription;
40+
import tech.ydb.table.values.DecimalType;
3941
import tech.ydb.table.values.Type;
4042

4143
public class YdbTableDefinition extends AbstractTableDefinition {
@@ -71,7 +73,7 @@ protected List<ColumnDefinition> getElements0() {
7173
kind = type.getKind();
7274
}
7375

74-
int decimalDigits = kind == Type.Kind.DECIMAL ? YdbConst.SQL_DECIMAL_DEFAULT_PRECISION : 0;
76+
int decimalDigits = kind == Type.Kind.DECIMAL ? ((DecimalType) type).getPrecision(): 0;
7577

7678
String typeName = type.toString();
7779
Class<? extends Binding<?, ?>> binding = getBinding(typeName);

0 commit comments

Comments
 (0)