Class BatchSequenceGenerator

  • All Implemented Interfaces:
    org.hibernate.boot.model.relational.ExportableProducer, org.hibernate.id.BulkInsertionCapableIdentifierGenerator, org.hibernate.id.Configurable, org.hibernate.id.IdentifierGenerator, org.hibernate.id.PersistentIdentifierGenerator

    public class BatchSequenceGenerator
    extends java.lang.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.

    Parameters

    The following configuration parameters are supported:
    "sequence"
    mandatory, name of the sequence to use
    "fetch_size"
    optional, how many sequence numbers should be fetched at a time, default is 10

    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
    • Constructor Detail

      • BatchSequenceGenerator

        public BatchSequenceGenerator()
    • Method Detail

      • configure

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

        private static java.lang.String buildSelect​(java.lang.String sequenceName,
                                                    org.hibernate.dialect.Dialect dialect)
      • buildDatabaseStructure

        private org.hibernate.id.enhanced.SequenceStructure buildDatabaseStructure​(org.hibernate.type.Type type,
                                                                                   java.lang.String sequenceName,
                                                                                   org.hibernate.engine.jdbc.env.spi.JdbcEnvironment jdbcEnvironment)
      • determineSequenceName

        private static java.lang.String determineSequenceName​(java.util.Properties params)
      • determineFetchSize

        private static int determineFetchSize​(java.util.Properties params)
      • supportsBulkInsertionIdentifierGeneration

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

        public java.lang.String determineBulkInsertionIdentifierGenerationSelectFragment​(org.hibernate.dialect.Dialect dialect)
        Specified by:
        determineBulkInsertionIdentifierGenerationSelectFragment in interface org.hibernate.id.BulkInsertionCapableIdentifierGenerator
      • generate

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

        public java.lang.Object generatorKey()
        Specified by:
        generatorKey in interface org.hibernate.id.PersistentIdentifierGenerator
      • getSequenceName

        private java.lang.String getSequenceName()
      • sqlCreateStrings

        @Deprecated
        public java.lang.String[] sqlCreateStrings​(org.hibernate.dialect.Dialect dialect)
        Deprecated.
        Specified by:
        sqlCreateStrings in interface org.hibernate.id.PersistentIdentifierGenerator
      • sqlDropStrings

        @Deprecated
        public java.lang.String[] sqlDropStrings​(org.hibernate.dialect.Dialect dialect)
        Deprecated.
        Specified by:
        sqlDropStrings in interface org.hibernate.id.PersistentIdentifierGenerator
      • registerExportables

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

        private BatchSequenceGenerator.IdentifierPool replenishIdentifierPool​(org.hibernate.engine.spi.SharedSessionContractImplementor session)
                                                                       throws org.hibernate.HibernateException
        Throws:
        org.hibernate.HibernateException
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object