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 simliar to the legacy
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 genertators (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:
CONFIG_PREFER_SEGMENT_PER_ENTITY
public static final String CONFIG_PREFER_SEGMENT_PER_ENTITY
DEFAULT_INCREMENT_SIZE
public static final int DEFAULT_INCREMENT_SIZE
DEFAULT_INITIAL_VALUE
public static final int DEFAULT_INITIAL_VALUE
DEF_SEGMENT_COLUMN
public static final String DEF_SEGMENT_COLUMN
DEF_SEGMENT_LENGTH
public static final int DEF_SEGMENT_LENGTH
DEF_SEGMENT_VALUE
public static final String DEF_SEGMENT_VALUE
DEF_TABLE
public static final String DEF_TABLE
DEF_VALUE_COLUMN
public static final String DEF_VALUE_COLUMN
INCREMENT_PARAM
public static final String INCREMENT_PARAM
INITIAL_PARAM
public static final String INITIAL_PARAM
OPT_PARAM
public static final String OPT_PARAM
SEGMENT_COLUMN_PARAM
public static final String SEGMENT_COLUMN_PARAM
SEGMENT_LENGTH_PARAM
public static final String SEGMENT_LENGTH_PARAM
SEGMENT_VALUE_PARAM
public static final String SEGMENT_VALUE_PARAM
TABLE_PARAM
public static final String TABLE_PARAM
VALUE_COLUMN_PARAM
public static final String VALUE_COLUMN_PARAM
buildInsertQuery
protected String buildInsertQuery()
buildSelectQuery
protected String buildSelectQuery(Dialect dialect)
buildUpdateQuery
protected String buildUpdateQuery()
determineDefaultSegmentValue
protected String determineDefaultSegmentValue(Properties params)
params
- The params supplied in the generator config (plus some standard useful extras).
- The default segment value to use.
determineIncrementSize
protected int determineIncrementSize(Properties params)
determineInitialValue
protected int determineInitialValue(Properties params)
determineSegmentColumnName
protected String determineSegmentColumnName(Properties params)
Determine the name of the column used to indicate the segment for each
row. This column acts as the primary key.
Called during
configuration
.
params
- The params supplied in the generator config (plus some standard useful extras).
- The name of the segment column
determineSegmentColumnSize
protected int determineSegmentColumnSize(Properties params)
params
- The params supplied in the generator config (plus some standard useful extras).
- The size of the segment column
determineSegmentValue
protected String determineSegmentValue(Properties params)
Determine the segment value corresponding to this generator instance.
Called during
configuration
.
params
- The params supplied in the generator config (plus some standard useful extras).
- The name of the value column
determineValueColumnName
protected String determineValueColumnName(Properties params)
Determine the name of the column in which we will store the generator persistent value.
Called during
configuration
.
params
- The params supplied in the generator config (plus some standard useful extras).
- The name of the value column
determneGeneratorTableName
protected String determneGeneratorTableName(Properties params)
Determine the table name to use for the generator values.
Called during
configuration
.
params
- The params supplied in the generator config (plus some standard useful extras).
getIdentifierType
public final Type getIdentifierType()
Type mapping for the identifier.
- The identifier type mapping.
getIncrementSize
public final int getIncrementSize()
The amount of increment to use. The exact implications of this
depends on the
optimizer
being used.
getInitialValue
public final int getInitialValue()
The initial value to use when we find no previous state in the
generator table corresponding to our sequence.
- The initial value to use.
getOptimizer
public final Optimizer getOptimizer()
The optimizer being used by this generator.
getSegmentColumnName
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.
getSegmentValue
public final String getSegmentValue()
The value in
segment column
which
corresponding to this generator instance. In other words this value
indicates the row in which this generator instance will store values.
- The segment value for this generator instance.
getSegmentValueLength
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'
getTableAccessCount
public final long getTableAccessCount()
Getter for property 'tableAccessCount'. Only really useful for unit test
assertions.
- Value for property 'tableAccessCount'.
getTableName
public final String getTableName()
The name of the table in which we store this generator's persistent state.
getValueColumnName
public final String getValueColumnName()
The name of the column in which we store our persistent generator value.
- The name of the value column.