Top Description Fields Constructors Methods
org.hibernate.id.enhanced

public Class TableGenerator

extends Object
implements PersistentIdentifierGenerator
Class Inheritance
All Implemented Interfaces
org.hibernate.id.PersistentIdentifierGenerator, org.hibernate.id.IdentifierGenerator, org.hibernate.boot.model.relational.ExportableProducer, org.hibernate.id.Configurable
Imports
java.io.Serializable, java.sql.Connection, .PreparedStatement, .ResultSet, .SQLException, .Types, java.util.Collections, .Map, .Properties, org.hibernate.LockMode, .LockOptions, .MappingException, org.hibernate.boot.model.naming.Identifier, org.hibernate.boot.model.relational.Database, .InitCommand, .Namespace, .QualifiedName, .QualifiedNameParser, .SqlStringGenerationContext, org.hibernate.cfg.AvailableSettings, org.hibernate.dialect.Dialect, org.hibernate.engine.config.spi.ConfigurationService, .StandardConverters, org.hibernate.engine.jdbc.env.spi.JdbcEnvironment, org.hibernate.engine.jdbc.internal.FormatStyle, org.hibernate.engine.jdbc.spi.JdbcServices, .SqlStatementLogger, org.hibernate.engine.spi.SessionEventListenerManager, .SharedSessionContractImplementor, org.hibernate.id.ExportableColumn, .IdentifierGenerator, .IdentifierGeneratorHelper, .IntegralDataTypeHolder, .PersistentIdentifierGenerator, org.hibernate.internal.CoreMessageLogger, org.hibernate.internal.util.StringHelper, org.hibernate.internal.util.config.ConfigurationHelper, org.hibernate.jdbc.AbstractReturningWork, org.hibernate.mapping.Column, .PrimaryKey, .Table, org.hibernate.service.ServiceRegistry, org.hibernate.type.LongType, .StringType, .Type, org.jboss.logging.Logger

Deprecated

as a consequence of PersistentIdentifierGenerator being deprecated. See corresponding docs for further information.

An enhanced version of table-based id generation.

Unlike the simplistic legacy one (which, btw, was only ever intended for subclassing support) we "segment" the table into multiple values. Thus a single table can actually serve as the persistent storage for multiple independent generators. One approach would be to segment the values by the name of the entity for which we are performing generation, which would mean that we would have a row in the generator table for each entity name. Or any configuration really; the setup is very flexible.

In this respect it is very similar to the legacy org.hibernate.id.MultipleHiLoPerTableGenerator in terms of the underlying storage structure (namely a single table capable of holding multiple generator values). The differentiator is, as with SequenceStyleGenerator as well, the externalized notion of an optimizer.

Note

that by default we use a single row for all generators (based on DEF_SEGMENT_VALUE). The configuration parameter CONFIG_PREFER_SEGMENT_PER_ENTITY can be used to change that to instead default to using a row for each entity name.

Configuration parameters:

NAME DEFAULT DESCRIPTION
TABLE_PARAM DEF_TABLE The name of the table to use to store/retrieve values
VALUE_COLUMN_PARAM DEF_VALUE_COLUMN The name of column which holds the sequence value for the given segment
SEGMENT_COLUMN_PARAM DEF_SEGMENT_COLUMN The name of the column which holds the segment key
SEGMENT_VALUE_PARAM DEF_SEGMENT_VALUE The value indicating which segment is used by this generator; refers to values in the SEGMENT_COLUMN_PARAM column
SEGMENT_LENGTH_PARAM DEF_SEGMENT_LENGTH The data length of the SEGMENT_COLUMN_PARAM column; used for schema creation
INITIAL_PARAM DEFAULT_INITIAL_VALUE The initial value to be stored for the given segment
INCREMENT_PARAM DEFAULT_INCREMENT_SIZE The increment size for the underlying segment; see the discussion on Optimizer for more details.
OPT_PARAM depends on defined increment size Allows explicit definition of which optimization strategy to use
Author
Steve Ebersole

Field Summary

Modifier and TypeField and Description
private long
public static final String
CONFIG_PREFER_SEGMENT_PER_ENTITY

By default (in the absence of a SEGMENT_VALUE_PARAM setting) we use a single row for all generators.

public static final String
public static final int
public static final String
public static final String
DEF_TABLE

The default TABLE_PARAM value

public static final String
public static final int
public static final int
private Type
public static final String
INCREMENT_PARAM

Indicates the increment size to use.

private int
public static final String
INITIAL_PARAM

Indicates the initial value to use.

private int
private String
private static final CoreMessageLogger
public static final String
OPT_PARAM

Indicates the optimizer to use, either naming a Optimizer implementation class or by naming a StandardOptimizerDescriptor by name

private Optimizer
private QualifiedName
private QualifiedName
public static final String
SEGMENT_COLUMN_PARAM

The name of the column which holds the segment key.

public static final String
SEGMENT_LENGTH_PARAM

Indicates the length of the column defined by SEGMENT_COLUMN_PARAM.

public static final String
SEGMENT_VALUE_PARAM

The value indicating which segment is used by this generator, as indicated by the actual value stored in the column indicated by SEGMENT_COLUMN_PARAM.

private String
private String
private int
private String
private boolean
public static final String
TABLE_PARAM

Configures the name of the table to use.

private String
public static final String
VALUE_COLUMN_PARAM

The name of column which holds the sequence value.

private String

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
protected String
buildInsertQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)

protected String
buildSelectQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)

protected String
buildUpdateQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)

public void
configure(Type
The id property type descriptor
type
,
Properties
param values, keyed by parameter name
params
,
ServiceRegistry
Access to service that may be needed.
serviceRegistry
)

Overrides default org.hibernate.id.IdentifierGenerator.configure.

Configure this instance, given the value of parameters specified by the user as <param> elements.
protected String

Returns:

The default segment value to use.
determineDefaultSegmentValue
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
)

Used in the cases where determineSegmentValue is unable to determine the value to use.

protected QualifiedName

Returns:

The table name to use.
determineGeneratorTableName
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
,
JdbcEnvironment
The JDBC environment
jdbcEnvironment
,
ServiceRegistry serviceRegistry)

Determine the table name to use for the generator values.

protected int
protected int
protected String

Returns:

The name of the segment column
determineSegmentColumnName
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
,
JdbcEnvironment
The JDBC environment
jdbcEnvironment
)

Determine the name of the column used to indicate the segment for each row.

protected int

Returns:

The size of the segment column
determineSegmentColumnSize
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
)

Determine the size of the segment column

Called during configuration.

protected String

Returns:

The name of the value column
determineSegmentValue
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
)

Determine the segment value corresponding to this generator instance.

protected String

Returns:

The name of the value column
determineValueColumnName
(Properties
The params supplied in the generator config (plus some standard useful extras).
params
,
JdbcEnvironment
The JDBC environment
jdbcEnvironment
)

Determine the name of the column in which we will store the generator persistent value.

private ResultSet
private int
public Serializable
generate(final SharedSessionContractImplementor
The session from which the request originates
session
,
final Object
the entity or collection (idbag) for which the id is being generated
obj
)

Implements org.hibernate.id.IdentifierGenerator.generate.

Generate a new identifier.
protected InitCommand
public Object
generatorKey()

Overrides default org.hibernate.id.PersistentIdentifierGenerator.generatorKey.

Deprecated
Return a key unique to the underlying database objects.
public String[]
getAllSqlForTests()

Deprecated Exposed for tests only.
public final Type

Returns:

The identifier type mapping.
getIdentifierType
()

Type mapping for the identifier.

public final int

Returns:

The increment amount.
getIncrementSize
()

The amount of increment to use.

public final int

Returns:

The initial value to use.
getInitialValue
()

The initial value to use when we find no previous state in the generator table corresponding to our sequence.

public final Optimizer

Returns:

Out optimizer.
getOptimizer
()

The optimizer being used by this generator.

public final String

Returns:

The segment column name
getSegmentColumnName
()

The name of the column in which we store the segment to which each row belongs.

public final String

Returns:

The segment value for this generator instance.
getSegmentValue
()

The value in segment column corresponding to this generator instance.

public final int

Returns:

the column size.
getSegmentValueLength
()

The size of the segment column in the underlying table.

public final long

Returns:

Value for property 'tableAccessCount'.
getTableAccessCount
()

Getter for property 'tableAccessCount'.

public final String

Returns:

The table name.
getTableName
()

The name of the table in which we store this generator's persistent state.

public final String

Returns:

The name of the value column.
getValueColumnName
()

The name of the column in which we store our persistent generator value.

public void
initialize(SqlStringGenerationContext
A context to help generate SQL strings
context
)

Overrides default org.hibernate.id.IdentifierGenerator.initialize.

Initializes this instance, in particular pre-generates SQL as necessary.
private IntegralDataTypeHolder
private PreparedStatement
prepareStatement(Connection connection, String sql, SqlStatementLogger statementLogger, SessionEventListenerManager statsCollector)

public void
registerExportables(Database
The database instance
database
)

Overrides default org.hibernate.id.IdentifierGenerator.registerExportables.

Register database objects used by this identifier generator, e.g. sequences, tables, etc.

This method is called just once, after configure(Type, Properties, ServiceRegistry).

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

accessCountback to summary
private long accessCount
CONFIG_PREFER_SEGMENT_PER_ENTITYback to summary
public static final String CONFIG_PREFER_SEGMENT_PER_ENTITY

By default (in the absence of a SEGMENT_VALUE_PARAM setting) we use a single row for all generators. This setting can be used to change that to instead default to using a row for each entity name.

DEF_SEGMENT_COLUMNback to summary
public static final String DEF_SEGMENT_COLUMN

The default SEGMENT_COLUMN_PARAM value

DEF_SEGMENT_LENGTHback to summary
public static final int DEF_SEGMENT_LENGTH

The default SEGMENT_LENGTH_PARAM value

Annotations
@SuppressWarnings:WeakerAccess
DEF_SEGMENT_VALUEback to summary
public static final String DEF_SEGMENT_VALUE

The default SEGMENT_VALUE_PARAM value, unless CONFIG_PREFER_SEGMENT_PER_ENTITY is specified

Annotations
@SuppressWarnings:WeakerAccess
DEF_TABLEback to summary
public static final String DEF_TABLE

The default TABLE_PARAM value

Annotations
@SuppressWarnings:WeakerAccess
DEF_VALUE_COLUMNback to summary
public static final String DEF_VALUE_COLUMN

The default VALUE_COLUMN_PARAM value

DEFAULT_INCREMENT_SIZEback to summary
public static final int DEFAULT_INCREMENT_SIZE

The default INCREMENT_PARAM value

Annotations
@SuppressWarnings:WeakerAccess
DEFAULT_INITIAL_VALUEback to summary
public static final int DEFAULT_INITIAL_VALUE

The default INITIAL_PARAM value

Annotations
@SuppressWarnings:WeakerAccess
identifierTypeback to summary
private Type identifierType
INCREMENT_PARAMback to summary
public static final String INCREMENT_PARAM

Indicates the increment size to use. The default value is DEFAULT_INCREMENT_SIZE

incrementSizeback to summary
private int incrementSize
INITIAL_PARAMback to summary
public static final String INITIAL_PARAM

Indicates the initial value to use. The default value is DEFAULT_INITIAL_VALUE

initialValueback to summary
private int initialValue
insertQueryback to summary
private String insertQuery
LOGback to summary
private static final CoreMessageLogger LOG
OPT_PARAMback to summary
public static final String OPT_PARAM

Indicates the optimizer to use, either naming a Optimizer implementation class or by naming a StandardOptimizerDescriptor by name

optimizerback to summary
private Optimizer optimizer
physicalTableNameback to summary
private QualifiedName physicalTableName
qualifiedTableNameback to summary
private QualifiedName qualifiedTableName
SEGMENT_COLUMN_PARAMback to summary
public static final String SEGMENT_COLUMN_PARAM

The name of the column which holds the segment key. The segment defines the different buckets (segments) of values currently tracked in the table. The default value is DEF_SEGMENT_COLUMN

SEGMENT_LENGTH_PARAMback to summary
public static final String SEGMENT_LENGTH_PARAM

Indicates the length of the column defined by SEGMENT_COLUMN_PARAM. Used in schema export. The default value is DEF_SEGMENT_LENGTH

Annotations
@SuppressWarnings:WeakerAccess
SEGMENT_VALUE_PARAMback to summary
public static final String SEGMENT_VALUE_PARAM

The value indicating which segment is used by this generator, as indicated by the actual value stored in the column indicated by SEGMENT_COLUMN_PARAM. The default value for setting is DEF_SEGMENT_VALUE, although CONFIG_PREFER_SEGMENT_PER_ENTITY effects the default as well.

segmentColumnNameback to summary
private String segmentColumnName
segmentValueback to summary
private String segmentValue
segmentValueLengthback to summary
private int segmentValueLength
selectQueryback to summary
private String selectQuery
storeLastUsedValueback to summary
private boolean storeLastUsedValue
TABLE_PARAMback to summary
public static final String TABLE_PARAM

Configures the name of the table to use. The default value is DEF_TABLE

updateQueryback to summary
private String updateQuery
VALUE_COLUMN_PARAMback to summary
public static final String VALUE_COLUMN_PARAM

The name of column which holds the sequence value. The default value is DEF_VALUE_COLUMN

valueColumnNameback to summary
private String valueColumnName

Constructor Detail

TableGeneratorback to summary
public TableGenerator()

Method Detail

buildInsertQueryback to summary
protected String buildInsertQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)
Annotations
@SuppressWarnings:WeakerAccess
buildSelectQueryback to summary
protected String buildSelectQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)
Annotations
@SuppressWarnings:unchecked, WeakerAccess
buildUpdateQueryback to summary
protected String buildUpdateQuery(String formattedPhysicalTableName, SqlStringGenerationContext context)
Annotations
@SuppressWarnings:WeakerAccess
configureback to summary
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException

Overrides default org.hibernate.id.IdentifierGenerator.configure.

Doc from org.hibernate.id.IdentifierGenerator.configure.

Configure this instance, given the value of parameters specified by the user as <param> elements.

This method is called just once, following instantiation, and before registerExportables(Database).

Parameters
type:Type

The id property type descriptor

params:Properties

param values, keyed by parameter name

serviceRegistry:ServiceRegistry

Access to service that may be needed.

Annotations
@Override
Exceptions
MappingException:
If configuration fails.
determineDefaultSegmentValueback to summary
protected String determineDefaultSegmentValue(Properties params)

Used in the cases where determineSegmentValue is unable to determine the value to use.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

Returns:String

The default segment value to use.

Annotations
@SuppressWarnings:WeakerAccess
determineGeneratorTableNameback to summary
protected QualifiedName determineGeneratorTableName(Properties params, JdbcEnvironment jdbcEnvironment, ServiceRegistry serviceRegistry)

Determine the table name to use for the generator values.

Called during configuration.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

jdbcEnvironment:JdbcEnvironment

The JDBC environment

Returns:QualifiedName

The table name to use.

Annotations
@SuppressWarnings:UnusedParameters, WeakerAccess
See Also
getTableName()
determineIncrementSizeback to summary
protected int determineIncrementSize(Properties params)
Annotations
@SuppressWarnings:WeakerAccess
determineInitialValueback to summary
protected int determineInitialValue(Properties params)
Annotations
@SuppressWarnings:WeakerAccess
determineSegmentColumnNameback to summary
protected String determineSegmentColumnName(Properties params, JdbcEnvironment jdbcEnvironment)

Determine the name of the column used to indicate the segment for each row. This column acts as the primary key.

Called during configuration.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

jdbcEnvironment:JdbcEnvironment

The JDBC environment

Returns:String

The name of the segment column

Annotations
@SuppressWarnings:UnusedParameters, WeakerAccess
See Also
getSegmentColumnName()
determineSegmentColumnSizeback to summary
protected int determineSegmentColumnSize(Properties params)

Determine the size of the segment column

Called during configuration.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

Returns:int

The size of the segment column

Annotations
@SuppressWarnings:WeakerAccess
See Also
getSegmentValueLength()
determineSegmentValueback to summary
protected String determineSegmentValue(Properties params)

Determine the segment value corresponding to this generator instance.

Called during configuration.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

Returns:String

The name of the value column

Annotations
@SuppressWarnings:WeakerAccess
See Also
getSegmentValue()
determineValueColumnNameback to summary
protected String determineValueColumnName(Properties params, JdbcEnvironment jdbcEnvironment)

Determine the name of the column in which we will store the generator persistent value.

Called during configuration.

Parameters
params:Properties

The params supplied in the generator config (plus some standard useful extras).

jdbcEnvironment:JdbcEnvironment

The JDBC environment

Returns:String

The name of the value column

Annotations
@SuppressWarnings:UnusedParameters, WeakerAccess
See Also
getValueColumnName()
executeQueryback to summary
private ResultSet executeQuery(PreparedStatement ps, SessionEventListenerManager statsCollector) throws SQLException
executeUpdateback to summary
private int executeUpdate(PreparedStatement ps, SessionEventListenerManager statsCollector) throws SQLException
generateback to summary
public Serializable generate(final SharedSessionContractImplementor session, final Object obj)

Implements org.hibernate.id.IdentifierGenerator.generate.

Doc from org.hibernate.id.IdentifierGenerator.generate.

Generate a new identifier.

Parameters
session:SharedSessionContractImplementor

The session from which the request originates

obj:Object

the entity or collection (idbag) for which the id is being generated

Returns:Serializable

a new identifier

Annotations
@Override
generateInsertInitCommandback to summary
protected InitCommand generateInsertInitCommand(SqlStringGenerationContext context)
generatorKeyback to summary
public Object generatorKey()

Overrides default org.hibernate.id.PersistentIdentifierGenerator.generatorKey.

Doc from org.hibernate.id.PersistentIdentifierGenerator.generatorKey.

Deprecated

Return a key unique to the underlying database objects. Prevents us from trying to create/remove them multiple times.

Returns:Object

Object an identifying key for this generator

Annotations
@Override
@Deprecated
getAllSqlForTestsback to summary
public String[] getAllSqlForTests()

Deprecated

Exposed for tests only.

Annotations
@Deprecated
getIdentifierTypeback to summary
public final Type getIdentifierType()

Type mapping for the identifier.

Returns:Type

The identifier type mapping.

getIncrementSizeback to summary
public final int getIncrementSize()

The amount of increment to use. The exact implications of this depends on the optimizer being used.

Returns:int

The increment amount.

getInitialValueback to summary
public final int getInitialValue()

The initial value to use when we find no previous state in the generator table corresponding to our sequence.

Returns:int

The initial value to use.

getOptimizerback to summary
public final Optimizer getOptimizer()

The optimizer being used by this generator.

Returns:Optimizer

Out optimizer.

getSegmentColumnNameback to summary
public final String getSegmentColumnName()

The name of the column in which we store the segment to which each row belongs. The value here acts as PK.

Returns:String

The segment column name

getSegmentValueback to summary
public final String getSegmentValue()

The value in segment column corresponding to this generator instance. In other words this value indicates the row in which this generator instance will store values.

Returns:String

The segment value for this generator instance.

getSegmentValueLengthback to summary
public final int getSegmentValueLength()

The size of the segment column in the underlying table.

Note

: should really have been called 'segmentColumnLength' or even better 'segmentColumnSize'

Returns:int

the column size.

Annotations
@SuppressWarnings:UnusedDeclaration, WeakerAccess
getTableAccessCountback to summary
public final long getTableAccessCount()

Getter for property 'tableAccessCount'. Only really useful for unit test assertions.

Returns:long

Value for property 'tableAccessCount'.

getTableNameback to summary
public final String getTableName()

The name of the table in which we store this generator's persistent state.

Returns:String

The table name.

getValueColumnNameback to summary
public final String getValueColumnName()

The name of the column in which we store our persistent generator value.

Returns:String

The name of the value column.

initializeback to summary
public void initialize(SqlStringGenerationContext context)

Overrides default org.hibernate.id.IdentifierGenerator.initialize.

Doc from org.hibernate.id.IdentifierGenerator.initialize.

Initializes this instance, in particular pre-generates SQL as necessary.

This method is called after registerExportables(Database), before first use.

Parameters
context:SqlStringGenerationContext

A context to help generate SQL strings

Annotations
@Override
makeValueback to summary
private IntegralDataTypeHolder makeValue()
prepareStatementback to summary
private PreparedStatement prepareStatement(Connection connection, String sql, SqlStatementLogger statementLogger, SessionEventListenerManager statsCollector) throws SQLException
registerExportablesback to summary
public void registerExportables(Database database)

Overrides default org.hibernate.id.IdentifierGenerator.registerExportables.

Doc from org.hibernate.id.IdentifierGenerator.registerExportables.

Register database objects used by this identifier generator, e.g. sequences, tables, etc.

This method is called just once, after configure(Type, Properties, ServiceRegistry).

Parameters
database:Database

The database instance

Annotations
@Override