Class BatchSequenceGenerator
java.lang.Object
io.hypersistence.utils.hibernate.id.BatchSequenceGenerator
- All Implemented Interfaces:
Serializable,org.hibernate.boot.model.relational.ExportableProducer,org.hibernate.generator.BeforeExecutionGenerator,org.hibernate.generator.Generator,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
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intThe default value forFETCH_SIZE_PARAM.static final StringDeprecated.static final StringDeprecated.useBatchSequenceFields inherited from interface org.hibernate.id.IdentifierGenerator
CONTRIBUTOR_NAME, ENTITY_NAME, GENERATOR_NAME, JPA_ENTITY_NAMEFields inherited from interface org.hibernate.id.OptimizableGenerator
DEFAULT_INCREMENT_SIZE, DEFAULT_INITIAL_VALUE, IMPLICIT_NAME_BASE, INCREMENT_PARAM, INITIAL_PARAM, OPT_PARAMFields inherited from interface org.hibernate.id.PersistentIdentifierGenerator
CATALOG, IDENTIFIER_NORMALIZER, PK, SCHEMA, TABLE, TABLES -
Constructor Summary
ConstructorsConstructorDescriptionBatchSequenceGenerator(BatchSequence annotation, Member annotatedMember, org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext context) Called whenBatchSequenceis used. -
Method Summary
Modifier and TypeMethodDescriptionvoidconfigure(org.hibernate.type.Type type, Properties params, org.hibernate.service.ServiceRegistry serviceRegistry) determineBulkInsertionIdentifierGenerationSelectFragment(org.hibernate.boot.model.relational.SqlStringGenerationContext sqlStringGenerationContext) org.hibernate.id.enhanced.Optimizervoidinitialize(org.hibernate.boot.model.relational.SqlStringGenerationContext context) voidregisterExportables(org.hibernate.boot.model.relational.Database database) booleantoString()Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.hibernate.generator.BeforeExecutionGenerator
generatedOnExecutionMethods inherited from interface org.hibernate.id.Configurable
createMethods inherited from interface org.hibernate.generator.Generator
allowAssignedIdentifiers, generatedOnExecution, generatesOnInsert, generatesOnUpdate, generatesSometimesMethods inherited from interface org.hibernate.id.IdentifierGenerator
generate, getEventTypes, supportsJdbcBatchInserts
-
Field Details
-
SEQUENCE_PARAM
Deprecated.useBatchSequenceIndicates the name of the sequence to use, mandatory.- See Also:
-
FETCH_SIZE_PARAM
Deprecated.useBatchSequenceIndicates how many sequence values to fetch at once. The default value isDEFAULT_FETCH_SIZE.- See Also:
-
DEFAULT_FETCH_SIZE
public static final int DEFAULT_FETCH_SIZEThe default value forFETCH_SIZE_PARAM.- See Also:
-
-
Constructor Details
-
BatchSequenceGenerator
public BatchSequenceGenerator(BatchSequence annotation, Member annotatedMember, org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext context) Called whenBatchSequenceis used.- Parameters:
annotation- meta annotation for configuration
-
-
Method Details
-
configure
public void configure(org.hibernate.type.Type type, Properties params, org.hibernate.service.ServiceRegistry serviceRegistry) throws org.hibernate.MappingException - Specified by:
configurein interfaceorg.hibernate.id.Configurable- Specified by:
configurein interfaceorg.hibernate.id.IdentifierGenerator- Throws:
org.hibernate.MappingException
-
initialize
public void initialize(org.hibernate.boot.model.relational.SqlStringGenerationContext context) - Specified by:
initializein interfaceorg.hibernate.id.Configurable
-
supportsBulkInsertionIdentifierGeneration
public boolean supportsBulkInsertionIdentifierGeneration()- Specified by:
supportsBulkInsertionIdentifierGenerationin interfaceorg.hibernate.id.BulkInsertionCapableIdentifierGenerator
-
determineBulkInsertionIdentifierGenerationSelectFragment
public String determineBulkInsertionIdentifierGenerationSelectFragment(org.hibernate.boot.model.relational.SqlStringGenerationContext sqlStringGenerationContext) - Specified by:
determineBulkInsertionIdentifierGenerationSelectFragmentin interfaceorg.hibernate.id.BulkInsertionCapableIdentifierGenerator
-
registerExportables
public void registerExportables(org.hibernate.boot.model.relational.Database database) - Specified by:
registerExportablesin interfaceorg.hibernate.boot.model.relational.ExportableProducer- Specified by:
registerExportablesin interfaceorg.hibernate.id.IdentifierGenerator
-
getOptimizer
public org.hibernate.id.enhanced.Optimizer getOptimizer()- Specified by:
getOptimizerin interfaceorg.hibernate.id.OptimizableGenerator
-
toString
-
BatchSequence