Package org.hibernate.id.enhanced
Class TableGenerator
java.lang.Object
org.hibernate.engine.TransactionHelper
org.hibernate.id.enhanced.TableGenerator
- All Implemented Interfaces:
Configurable,IdentifierGenerator,PersistentIdentifierGenerator
public class TableGenerator
extends TransactionHelper
implements PersistentIdentifierGenerator, Configurable
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
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 |
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final Stringstatic final Stringstatic final intstatic final Stringstatic final Stringstatic final Stringstatic final intstatic final intstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final Stringstatic final StringFields inherited from interface org.hibernate.id.IdentifierGenerator
ENTITY_NAMEFields inherited from interface org.hibernate.id.PersistentIdentifierGenerator
CATALOG, IDENTIFIER_NORMALIZER, PK, SCHEMA, SQL_STATEMENT_LOGGER, TABLE, TABLES -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected Stringprotected StringbuildSelectQuery(Dialect dialect) protected Stringvoidconfigure(Type type, Properties params, Dialect dialect) Configure this instance, given the value of parameters specified by the user as <param> elements.protected StringUsed in the cases wheredetermineSegmentValue(java.util.Properties)is unable to determine the value to use.protected StringdetermineGeneratorTableName(Properties params, Dialect dialect) Determine the table name to use for the generator values.protected intdetermineIncrementSize(Properties params) protected intdetermineInitialValue(Properties params) protected StringdetermineSegmentColumnName(Properties params, Dialect dialect) Determine the name of the column used to indicate the segment for each row.protected intdetermineSegmentColumnSize(Properties params) Determine the size of thesegment columnprotected StringdetermineSegmentValue(Properties params) Determine the segment value corresponding to this generator instance.protected StringdetermineValueColumnName(Properties params, Dialect dialect) Determine the name of the column in which we will store the generator persistent value.doWorkInCurrentTransaction(Connection conn, String sql) The work to be donegenerate(SessionImplementor session, Object obj) Generate a new identifier.Return a key unique to the underlying database objects.final TypeType mapping for the identifier.final intThe amount of increment to use.final intThe initial value to use when we find no previous state in the generator table corresponding to our sequence.final OptimizerThe optimizer being used by this generator.final StringThe name of the column in which we store the segment to which each row belongs.final StringThe value insegment columnwhich corresponding to this generator instance.final intThe size of thesegment columnin the underlying table.final longGetter for property 'tableAccessCount'.final StringThe name of the table in which we store this generator's persistent state.final StringThe name of the column in which we store our persistent generator value.String[]sqlCreateStrings(Dialect dialect) The SQL required to create the underlying database objects.String[]sqlDropStrings(Dialect dialect) The SQL required to remove the underlying database objects.Methods inherited from class org.hibernate.engine.TransactionHelper
doWorkInNewTransaction
-
Field Details
-
CONFIG_PREFER_SEGMENT_PER_ENTITY
- See Also:
-
TABLE_PARAM
- See Also:
-
DEF_TABLE
- See Also:
-
VALUE_COLUMN_PARAM
- See Also:
-
DEF_VALUE_COLUMN
- See Also:
-
SEGMENT_COLUMN_PARAM
- See Also:
-
DEF_SEGMENT_COLUMN
- See Also:
-
SEGMENT_VALUE_PARAM
- See Also:
-
DEF_SEGMENT_VALUE
- See Also:
-
SEGMENT_LENGTH_PARAM
- See Also:
-
DEF_SEGMENT_LENGTH
public static final int DEF_SEGMENT_LENGTH- See Also:
-
INITIAL_PARAM
- See Also:
-
DEFAULT_INITIAL_VALUE
public static final int DEFAULT_INITIAL_VALUE- See Also:
-
INCREMENT_PARAM
- See Also:
-
DEFAULT_INCREMENT_SIZE
public static final int DEFAULT_INCREMENT_SIZE- See Also:
-
OPT_PARAM
- See Also:
-
-
Constructor Details
-
TableGenerator
public TableGenerator()
-
-
Method Details
-
generatorKey
Return a key unique to the underlying database objects. Prevents us from trying to create/remove them multiple times.- Specified by:
generatorKeyin interfacePersistentIdentifierGenerator- Returns:
- Object an identifying key for this generator
-
getIdentifierType
Type mapping for the identifier.- Returns:
- The identifier type mapping.
-
getTableName
The name of the table in which we store this generator's persistent state.- Returns:
- The table name.
-
getSegmentColumnName
The name of the column in which we store the segment to which each row belongs. The value here acts as PK.- Returns:
- The segment column name
-
getSegmentValue
The value insegment columnwhich corresponding to this generator instance. In other words this value indicates the row in which this generator instance will store values.- Returns:
- The segment value for this generator instance.
-
getSegmentValueLength
public final int getSegmentValueLength()The size of thesegment columnin the underlying table. NOTE : should really have been called 'segmentColumnLength' or even better 'segmentColumnSize'- Returns:
- the column size.
-
getValueColumnName
The name of the column in which we store our persistent generator value.- Returns:
- The name of the value column.
-
getInitialValue
public final int getInitialValue()The initial value to use when we find no previous state in the generator table corresponding to our sequence.- Returns:
- The initial value to use.
-
getIncrementSize
public final int getIncrementSize()The amount of increment to use. The exact implications of this depends on theoptimizerbeing used.- Returns:
- The increment amount.
-
getOptimizer
The optimizer being used by this generator.- Returns:
- Out optimizer.
-
getTableAccessCount
public final long getTableAccessCount()Getter for property 'tableAccessCount'. Only really useful for unit test assertions.- Returns:
- Value for property 'tableAccessCount'.
-
configure
Configure this instance, given the value of parameters specified by the user as <param> elements. This method is called just once, following instantiation.- Specified by:
configurein interfaceConfigurable- Parameters:
params- param values, keyed by parameter name- Throws:
MappingException
-
determineGeneratorTableName
Determine the table name to use for the generator values. Called duringconfiguration.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).dialect- The dialect in effect- Returns:
- The table name to use.
- See Also:
-
determineSegmentColumnName
Determine the name of the column used to indicate the segment for each row. This column acts as the primary key. Called duringconfiguration.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).dialect- The dialect in effect- Returns:
- The name of the segment column
- See Also:
-
determineValueColumnName
Determine the name of the column in which we will store the generator persistent value. Called duringconfiguration.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).dialect- The dialect in effect- Returns:
- The name of the value column
- See Also:
-
determineSegmentValue
Determine the segment value corresponding to this generator instance. Called duringconfiguration.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).- Returns:
- The name of the value column
- See Also:
-
determineDefaultSegmentValue
Used in the cases wheredetermineSegmentValue(java.util.Properties)is unable to determine the value to use.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).- Returns:
- The default segment value to use.
-
determineSegmentColumnSize
Determine the size of thesegment columnCalled duringconfiguration.- Parameters:
params- The params supplied in the generator config (plus some standard useful extras).- Returns:
- The size of the segment column
- See Also:
-
determineInitialValue
-
determineIncrementSize
-
buildSelectQuery
-
buildUpdateQuery
-
buildInsertQuery
-
generate
Generate a new identifier.- Specified by:
generatein interfaceIdentifierGenerator- Parameters:
session-obj- the entity or toplevel collection for which the id is being generated- Returns:
- a new identifier
-
doWorkInCurrentTransaction
The work to be done- Specified by:
doWorkInCurrentTransactionin classTransactionHelper- Throws:
SQLException
-
sqlCreateStrings
The SQL required to create the underlying database objects.- Specified by:
sqlCreateStringsin interfacePersistentIdentifierGenerator- Parameters:
dialect- The dialect against which to generate the create command(s)- Returns:
- The create command(s)
- Throws:
HibernateException- problem creating the create command(s)
-
sqlDropStrings
The SQL required to remove the underlying database objects.- Specified by:
sqlDropStringsin interfacePersistentIdentifierGenerator- Parameters:
dialect- The dialect against which to generate the drop command(s)- Returns:
- The drop command(s)
- Throws:
HibernateException- problem creating the drop command(s)
-