Devoxx Belgium 2025 was held in Antwerp from October 6–10, 2025. One of Europe’s largest developer conferences, Devoxx draws thousands of JVM ecosystem developers across Java, Kotlin, and Scala communities.

UUID v7 Comes to the JVM Standard Library

The most anticipated session on UUID topics previewed a JEP (JDK Enhancement Proposal) targeting a future Java LTS release to add UUID.randomUUID7() to java.util.UUID. While not yet merged, the proposal has formal champion status and active discussion on the OpenJDK mailing list.

Until the JEP lands, Devoxx sessions recommeded java-uuid-generator (JUG) as the production-ready bridge:

import com.fasterxml.uuid.Generators;
import java.util.UUID;

UUID id = Generators.timeBasedEpochGenerator().generate(); // UUID v7

JUG is maintained by the author of the Jackson JSON library, widely deployed in Spring Boot applications, and conforms to RFC 9562’s monotonic counter recommendation.

Hibernate 6.5 and Spring Boot

A detailed talk walked through Hibernate 6.5+‘s native UUID v7 support in a Spring Boot 3.3+ application:

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue
    @UuidGenerator(style = UuidGenerator.Style.TIME)
    private UUID id;

    @Column(nullable = false)
    private String customerId;

    @CreationTimestamp
    private Instant createdAt;
}

UuidGenerator.Style.TIME in Hibernate 6.5 maps to RFC 9562 UUID v7, not the older time-based UUID v1. Speakers confirmed that switching from Style.RANDOM (v4) to Style.TIME (v7) requires no schema migration — the database uuid column type stores both versions identically.

Kotlin Data Classes

For Kotlin-first projects using Spring Data JPA:

@Entity
@Table(name = "products")
data class Product(
    @Id
    @GeneratedValue
    @UuidGenerator(style = UuidGenerator.Style.TIME)
    val id: UUID = UUID(0L, 0L), // placeholder; Hibernate overwrites before persist

    @Column(nullable = false)
    val name: String,
)

The UUID(0L, 0L) default satisfies Kotlin’s non-null requirement while Hibernate replaces it with a v7 UUID before the insert hits the database.

Quarkus and Panache

Quarkus sessions covered UUID v7 in both JPA and Panache active record patterns:

// Panache entity
@Entity
public class Invoice extends PanacheEntityBase {

    @Id
    @GeneratedValue
    @UuidGenerator(style = UuidGenerator.Style.TIME)
    public UUID id;

    public BigDecimal amount;
}

// Usage
Invoice invoice = new Invoice();
invoice.amount = new BigDecimal("99.00");
invoice.persist(); // id is assigned a UUID v7 value by Hibernate before insert

JVM Performance Benchmarks

A benchmarking talk using JMH (Java Microbenchmark Harness) measured UUID generation throughput:

MethodThroughput (ops/ms)
UUID.randomUUID() (v4)~4,200
JUG timeBasedEpochGenerator (v7)~3,800
Hibernate @UuidGenerator(TIME)~3,750

Generation throughput is not the bottleneck in any real application — database insert time dominates. The index performance advantage of UUID v7 over v4 at the database layer far outweighs the negligible generation cost difference.

Frequently asked questions

What UUID topics were covered at Devoxx Belgium 2025?

Devoxx Belgium 2025 featured sessions on UUID v7 across the JVM — Hibernate 6.5 @UuidGenerator(style = UuidGenerator.Style.TIME), Kotlin data class patterns, Quarkus Panache integration, and JMH benchmarks. Speakers also previewed an OpenJDK JEP proposing UUID.randomUUID7() for a future Java LTS. The Devoxx website hosts session recordings.

How do I use UUID v7 as a primary key in Java with Hibernate?

Hibernate 6.5+ supports UUID v7 via @UuidGenerator(style = UuidGenerator.Style.TIME). For older Hibernate versions, use the java-uuid-generator (JUG) library: Generators.timeBasedEpochGenerator().generate(). No schema migration is needed — the database uuid column type stores both v4 and v7 identically.

Do UUIDs hurt database index performance?

UUID v4 does — its randomness causes every insert to land at a different leaf page, leading to page splits and poor cache locality. UUID v7 embeds a millisecond timestamp so consecutive inserts cluster together, behaving like an auto-increment integer for B-tree purposes.

How do I use UUID v7 in Kotlin?

Kotlin uses Java's java.util.UUID class. For UUID v7, use the java-uuid-generator (JUG) library: val id = Generators.timeBasedEpochGenerator().generate(). In Kotlin data classes, declare the ID field as java.util.UUID and assign via a default parameter or init block.

Does Quarkus support UUID v7 primary keys?

Quarkus uses Hibernate ORM under the hood, so Hibernate 6.5's @UuidGenerator(style = UuidGenerator.Style.TIME) works directly. The Quarkus Panache guide covers entity configuration. For Panache's active record pattern, override the persist() logic or use a Hibernate interceptor to inject UUID v7 values before insert.