Class BatchSequenceGenerator

java.lang.Object
io.hypersistence.utils.hibernate.id.BatchSequenceGenerator
All Implemented Interfaces:
org.hibernate.boot.model.relational.ExportableProducer, org.hibernate.id.BulkInsertionCapableIdentifierGenerator, org.hibernate.id.Configurable, org.hibernate.id.factory.spi.StandardGenerator, org.hibernate.id.IdentifierGenerator, org.hibernate.id.OptimizableGenerator, org.hibernate.id.PersistentIdentifierGenerator

public class BatchSequenceGenerator extends Object implements org.hibernate.id.BulkInsertionCapableIdentifierGenerator, org.hibernate.id.PersistentIdentifierGenerator, org.hibernate.id.Configurable
A sequence generator that uses a recursive query to fetch multiple values from a sequence in a single database access.

Configuration


 @Id
 @BatchSequence(name = "SOME_SEQUENCE_NAME", fetch_size = SOME_FETCH_SIZE_VALUE)
 private Long someColumnName;
 

SQL

Per default the generated SELECT will look something like this

 WITH RECURSIVE t(n) AS (
   SELECT 1
     UNION ALL
   SELECT n + 1
   FROM t
   WHERE n < ?)
 SELECT nextval(seq_xxx)
   FROM t;
 

DB2

For DB2 the generated SELECT will look something like this

 WITH t(n) AS (
   SELECT 1 AS n
     FROM (VALUES 1)
       UNION ALL
     SELECT n + 1 AS n
       FROM t
      WHERE n < ?)
 SELECT next value for SEQ_CHILD_ID AS n
   FROM t;
 

HSQLDB

For HSQLDB the generated SELECT will look something like this

 SELECT next value for seq_parent_id
   FROM UNNEST(SEQUENCE_ARRAY(1, ?, 1));
 

Oracle

For Oracle the generated SELECT will look something like this because Oracle does not support using recursive common table expressions to fetch multiple values from a sequence.

 SELECT seq_xxx.nextval
 FROM dual
 CONNECT BY rownum <= ?
 

SQL Server

For SQL Server the generated SELECT will look something like this

 WITH t(n) AS (
   SELECT 1 AS n
     UNION ALL
   SELECT n + 1 AS n
     FROM t
    WHERE n < ?)
 SELECT NEXT VALUE FOR seq_xxx AS n
   FROM t
 

Firebird

For Firebird the generated SELECT will look something like this

 WITH RECURSIVE t(n, level_num) AS (
   SELECT NEXT VALUE FOR seq_xxx AS n, 1 AS level_num
   FROM rdb$database
     UNION ALL
   SELECT NEXT VALUE FOR seq_xxx AS n, level_num + 1 AS level_num
     FROM t
    WHERE level_num < ?)
 SELECT n
   FROM t
 

Database Support

The following RDBMS have been verified to work
  • DB2
  • Firebird
  • Oracle
  • H2
  • HSQLDB
  • MariaDB
  • Postgres
  • SQL Sever

In theory any RDBMS that supports WITH RECURSIVE and sequences is supported.

For more details about how to use it, check out this article on vladmihalcea.com.

Since:
2.14.0
Author:
Philippe Marschall
  • Field Details

  • Constructor Details

    • BatchSequenceGenerator

      public BatchSequenceGenerator(BatchSequence annotation, Member annotatedMember, org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext context)
      Called when BatchSequence is used.
      Parameters:
      annotation - meta annotation for configuration
    • BatchSequenceGenerator

      public BatchSequenceGenerator()
      Called when GenericGenerator is used.
  • Method Details

    • configure

      public void configure(org.hibernate.type.Type type, Properties params, org.hibernate.service.ServiceRegistry serviceRegistry) throws org.hibernate.MappingException
      Specified by:
      configure in interface org.hibernate.id.Configurable
      Specified by:
      configure in interface org.hibernate.id.IdentifierGenerator
      Throws:
      org.hibernate.MappingException
    • initialize

      public void initialize(org.hibernate.boot.model.relational.SqlStringGenerationContext context)
      Specified by:
      initialize in interface org.hibernate.id.IdentifierGenerator
    • supportsBulkInsertionIdentifierGeneration

      public boolean supportsBulkInsertionIdentifierGeneration()
      Specified by:
      supportsBulkInsertionIdentifierGeneration in interface org.hibernate.id.BulkInsertionCapableIdentifierGenerator
    • determineBulkInsertionIdentifierGenerationSelectFragment

      public String determineBulkInsertionIdentifierGenerationSelectFragment(org.hibernate.boot.model.relational.SqlStringGenerationContext sqlStringGenerationContext)
      Specified by:
      determineBulkInsertionIdentifierGenerationSelectFragment in interface org.hibernate.id.BulkInsertionCapableIdentifierGenerator
    • generate

      public Serializable generate(org.hibernate.engine.spi.SharedSessionContractImplementor session, Object object) throws org.hibernate.HibernateException
      Specified by:
      generate in interface org.hibernate.id.IdentifierGenerator
      Throws:
      org.hibernate.HibernateException
    • registerExportables

      public void registerExportables(org.hibernate.boot.model.relational.Database database)
      Specified by:
      registerExportables in interface org.hibernate.boot.model.relational.ExportableProducer
      Specified by:
      registerExportables in interface org.hibernate.id.IdentifierGenerator
    • getOptimizer

      public org.hibernate.id.enhanced.Optimizer getOptimizer()
      Specified by:
      getOptimizer in interface org.hibernate.id.OptimizableGenerator
    • toString

      public String toString()
      Overrides:
      toString in class Object