Skip to content

Commit 4c9c4c7

Browse files
feat: prepare support YDB Serial types (#182)
1 parent 49cde3a commit 4c9c4c7

File tree

7 files changed

+238
-0
lines changed

7 files changed

+238
-0
lines changed

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

+17
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
}
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+
}
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+
}
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+
}
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+
}
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+
}
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+
}

0 commit comments

Comments
 (0)