Skip to content

[BUG]: #hibernate-v6 UnsupportedOperationException: YDB does not support FOR UPDATE statement #194

Description

@atten

Got an exception during schema generation for entity containing @GeneratedValue annotation without arguments:

java.lang.UnsupportedOperationException: YDB does not support FOR UPDATE statement
	at tech.ydb.hibernate.dialect.YdbDialect.getForUpdateString(YdbDialect.java:359)

Works fine if changed to @GeneratedValue(strategy = GenerationType.IDENTITY).

helloworld.java:

import jakarta.persistence.EntityManager;
import jakarta.persistence.Persistence;

EntityManager entityManager() {
    return Persistence.createEntityManagerFactory("default").createEntityManager();
}

account.java:

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.Instant;
import java.util.Currency;

@Entity
@Table(name = "accounts", uniqueConstraints = { @UniqueConstraint(columnNames = { "name", "currency" }) })
public class Account {
    @Id
    @GeneratedValue
    @Getter
    private long id;

    @Column(nullable = false)
    @Getter
    @Setter
    private String name;

    @Getter
    @Setter
    private String notes;

    @Column(nullable = false)
    private String currency;

    @Column(nullable = false, name = "created_at", updatable = false)
    @Getter
    @Setter
    private Instant createdAt;
}

persistence.xml:

<persistence-unit name="default">
   <class>bookkeeper.dao.entity.Account</class>
   <properties>
          <property name="hibernate.dialect" value="tech.ydb.hibernate.dialect.YdbDialect"/>
          <property name="jakarta.persistence.schema-generation.database.action" value="update"/>
          <property name="jakarta.persistence.jdbc.driver" value="tech.ydb.jdbc.YdbDriver"/>
      </properties>
      ...
  </persistence-unit>

build.gradle:

sourceCompatibility = JavaVersion.VERSION_21

dependencies {
    implementation 'jakarta.persistence:jakarta.persistence-api:3.2.0'
    implementation 'org.hibernate.orm:hibernate-core:7.1.0.Final'
    implementation 'tech.ydb.dialects:hibernate-ydb-dialect:1.5.0'
    implementation 'tech.ydb.jdbc:ydb-jdbc-driver:2.3.16'
}

...

Traceback:

16:25:50: Executing 'app:run'...

> Task :app:generateEffectiveLombokConfig UP-TO-DATE
> Task :app:compileJava UP-TO-DATE
> Task :app:processResources
> Task :app:classes

> Task :app:run FAILED
20-08-2025 16:25:51.141 | main | INFO  | o.h.j.i.util.LogHelper                   | HHH000204: Processing PersistenceUnitInfo [name: default]
20-08-2025 16:25:51.230 | main | INFO  | org.hibernate.Version                    | HHH000412: Hibernate ORM core version 7.1.0.Final
20-08-2025 16:25:51.376 | main | WARN  | o.h.o.connections.pooling                | HHH10001002: Using built-in connection pool (not intended for production use)
20-08-2025 16:25:51.399 | main | INFO  | t.y.c.i.YdbTransportImpl                 | Create YDB transport with endpoint Endpoint{host=localhost, port=2136, node=0, location=null, overrideAuthority=null} and BalancingSettings{policy=USE_ALL_NODES, preferableLocation='null}
20-08-2025 16:25:51.447 | main | INFO  | t.y.c.i.p.ChannelFactoryLoader           | class io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder is found, use ShadedNettyChannelFactory
20-08-2025 16:25:51.449 | main | INFO  | t.y.c.a.StaticCredentials                | create static identity for database /local
20-08-2025 16:25:51.451 | ydb-jdbc-scheduler[1211593500]-thread-1 | INFO  | t.y.core.impl.YdbDiscovery               | Waiting for init discovery...
20-08-2025 16:25:51.665 | main | INFO  | t.y.t.i.pool.SessionPool                 | init session pool, min size = 10, max size = 50, keep alive period = 30000
20-08-2025 16:25:51.670 | main | INFO  | t.y.query.impl.SessionPool               | init QuerySession pool, min size = 0, max size = 50, keep alive period = 100000
20-08-2025 16:25:51.687 | main | INFO  | t.y.query.impl.SessionPool               | closing QuerySession pool
20-08-2025 16:25:51.687 | main | INFO  | t.y.t.i.pool.SessionPool                 | closing session pool
20-08-2025 16:25:51.688 | main | INFO  | t.y.c.i.YdbTransportImpl                 | Create YDB transport with endpoint Endpoint{host=localhost, port=2136, node=0, location=null, overrideAuthority=null} and BalancingSettings{policy=USE_ALL_NODES, preferableLocation='null}
20-08-2025 16:25:51.688 | main | INFO  | t.y.c.a.StaticCredentials                | create static identity for database /local
20-08-2025 16:25:51.688 | ydb-jdbc-scheduler[1211593500]-thread-1 | INFO  | t.y.core.impl.YdbDiscovery               | Waiting for init discovery...
20-08-2025 16:25:51.710 | main | INFO  | t.y.t.i.pool.SessionPool                 | init session pool, min size = 10, max size = 50, keep alive period = 30000
20-08-2025 16:25:51.710 | main | INFO  | t.y.query.impl.SessionPool               | init QuerySession pool, min size = 0, max size = 50, keep alive period = 100000
20-08-2025 16:25:51.788 | main | INFO  | o.h.o.connections.pooling                | HHH10001005: Database info:
	Database JDBC URL [jdbc:ydb:grpc://localhost:2136/local]
	Database driver: YDB JDBC Driver
	Database dialect: YdbDialect
	Database version: 0.0
	Default catalog/schema: unknown/undefined
	Autocommit mode: false
	Isolation level: SERIALIZABLE
	JDBC fetch size: 1000
	Pool: DriverManagerConnectionProviderImpl
	Minimum pool size: 1
	Maximum pool size: 20
20-08-2025 16:25:51.907 | main | INFO  | t.y.query.impl.SessionPool               | closing QuerySession pool
20-08-2025 16:25:51.907 | main | INFO  | t.y.t.i.pool.SessionPool                 | closing session pool

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.10/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
4 actionable tasks: 2 executed, 2 up-to-date
Aug 20, 2025 4:25:51 PM tech.ydb.jdbc.YdbDriver register
INFO: YDB JDBC Driver registered: YDB JDBC Driver 2.3.16(based on SDK 2.3.18)
Exception in thread "main" java.lang.UnsupportedOperationException: YDB does not support FOR UPDATE statement
	at tech.ydb.hibernate.dialect.YdbDialect.getForUpdateString(YdbDialect.java:359)
	at org.hibernate.id.enhanced.TableStructure.initialize(TableStructure.java:344)
	at org.hibernate.id.enhanced.SequenceStyleGenerator.initialize(SequenceStyleGenerator.java:313)
	at org.hibernate.boot.model.internal.GeneratorAnnotationHelper.prepareForUse(GeneratorAnnotationHelper.java:311)
	at org.hibernate.boot.model.internal.GeneratorAnnotationHelper.lambda$handleSequenceGenerator$2(GeneratorAnnotationHelper.java:182)
	at org.hibernate.mapping.SimpleValue.createGenerator(SimpleValue.java:421)
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.handleIdentifierValueBinding(InFlightMetadataCollectorImpl.java:2103)
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processExportableProducers(InFlightMetadataCollectorImpl.java:2079)
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.buildMetadataInstance(InFlightMetadataCollectorImpl.java:2039)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:228)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1412)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.populateSessionFactoryBuilder(EntityManagerFactoryBuilderImpl.java:1493)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1475)
	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
	at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:90)
	at bookkeeper.telegram.Config.entityManager(Config.java:46)
	at bookkeeper.telegram.Config_EntityManagerFactory.entityManager(Config_EntityManagerFactory.java:41)
	at bookkeeper.telegram.Config_EntityManagerFactory.get(Config_EntityManagerFactory.java:33)
	at bookkeeper.telegram.Config_EntityManagerFactory.get(Config_EntityManagerFactory.java:11)
	at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
	at bookkeeper.telegram.DaggerTelegramContainer$TelegramContainerImpl.bot(DaggerTelegramContainer.java:279)
	at bookkeeper.telegram.App.main(App.java:8)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:run'.
> Process 'command '/usr/lib/jvm/java-21-openjdk-amd64/bin/java'' finished with non-zero exit value 1

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

BUILD FAILED in 1s
16:25:52: Execution finished 'app:run'.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions