## org.hibernate.id.enhanced
Class TableGenerator

    java.lang.Object
      org.hibernate.id.enhanced.TableGenerator

All Implemented Interfaces:
  Configurable, IdentifierGenerator, PersistentIdentifierGenerator

    public class TableGenerator

extends Object
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
`static String` `CONFIG_PREFER_SEGMENT_PER_ENTITY`
`static String` `DEF_SEGMENT_COLUMN`
`static int` `DEF_SEGMENT_LENGTH`
`static String` `DEF_SEGMENT_VALUE`
`static String` `DEF_TABLE`
`static String` `DEF_VALUE_COLUMN`
`static int` `DEFAULT_INCREMENT_SIZE`
`static int` `DEFAULT_INITIAL_VALUE`
`static String` `INCREMENT_PARAM`
`static String` `INITIAL_PARAM`
`static String` `OPT_PARAM`
`static String` `SEGMENT_COLUMN_PARAM`
`static String` `SEGMENT_LENGTH_PARAM`
`static String` `SEGMENT_VALUE_PARAM`
`static String` `TABLE_PARAM`
`static String` `VALUE_COLUMN_PARAM`

Fields inherited from interface org.hibernate.id.PersistentIdentifierGenerator
`CATALOG, IDENTIFIER_NORMALIZER, PK, SCHEMA, TABLE, TABLES`

Fields inherited from interface org.hibernate.id.IdentifierGenerator
`ENTITY_NAME`

Constructor Summary
`TableGenerator()`

Method Summary
`protected String` `buildInsertQuery()`
`protected String` `buildSelectQuery(Dialect dialect)`
`protected String` `buildUpdateQuery()`
`void` `configure(Type type, Properties params, Dialect dialect)` Configure this instance, given the value of parameters specified by the user as `<param>` elements.
`protected String` `determineDefaultSegmentValue(Properties params)` Used in the cases where `determineSegmentValue(java.util.Properties)` is unable to determine the value to use.
`protected String` `determineGeneratorTableName(Properties params, Dialect dialect)` Determine the table name to use for the generator values.
`protected int` `determineIncrementSize(Properties params)`
`protected int` `determineInitialValue(Properties params)`
`protected String` `determineSegmentColumnName(Properties params, Dialect dialect)` Determine the name of the column used to indicate the segment for each row.
`protected int` `determineSegmentColumnSize(Properties params)` Determine the size of the `segment column` Called during `configuration`.
`protected String` `determineSegmentValue(Properties params)` Determine the segment value corresponding to this generator instance.
`protected String` `determineValueColumnName(Properties params, Dialect dialect)` Determine the name of the column in which we will store the generator persistent value.
`Serializable` `generate(SessionImplementor session, Object obj)` Generate a new identifier.
`Object` `generatorKey()` Return a key unique to the underlying database objects.
`Type` `getIdentifierType()` Type mapping for the identifier.
`int` `getIncrementSize()` The amount of increment to use.
`int` `getInitialValue()` The initial value to use when we find no previous state in the generator table corresponding to our sequence.
`Optimizer` `getOptimizer()` The optimizer being used by this generator.
`String` `getSegmentColumnName()` The name of the column in which we store the segment to which each row belongs.
`String` `getSegmentValue()` The value in `segment column` which corresponding to this generator instance.
`int` `getSegmentValueLength()` The size of the `segment column` in the underlying table.
`long` `getTableAccessCount()` Getter for property 'tableAccessCount'.
`String` `getTableName()` The name of the table in which we store this generator's persistent state.
`String` `getValueColumnName()` The 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 java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### CONFIG_PREFER_SEGMENT_PER_ENTITY

    public static final String CONFIG_PREFER_SEGMENT_PER_ENTITY

See Also:
  Constant Field Values

### TABLE_PARAM

    public static final String TABLE_PARAM

See Also:
  Constant Field Values

### DEF_TABLE

    public static final String DEF_TABLE

See Also:
  Constant Field Values

### VALUE_COLUMN_PARAM

    public static final String VALUE_COLUMN_PARAM

See Also:
  Constant Field Values

### DEF_VALUE_COLUMN

    public static final String DEF_VALUE_COLUMN

See Also:
  Constant Field Values

### SEGMENT_COLUMN_PARAM

    public static final String SEGMENT_COLUMN_PARAM

See Also:
  Constant Field Values

### DEF_SEGMENT_COLUMN

    public static final String DEF_SEGMENT_COLUMN

See Also:
  Constant Field Values

### SEGMENT_VALUE_PARAM

    public static final String SEGMENT_VALUE_PARAM

See Also:
  Constant Field Values

### DEF_SEGMENT_VALUE

    public static final String DEF_SEGMENT_VALUE

See Also:
  Constant Field Values

### SEGMENT_LENGTH_PARAM

    public static final String SEGMENT_LENGTH_PARAM

See Also:
  Constant Field Values

### DEF_SEGMENT_LENGTH

    public static final int DEF_SEGMENT_LENGTH

See Also:
  Constant Field Values

### INITIAL_PARAM

    public static final String INITIAL_PARAM

See Also:
  Constant Field Values

### DEFAULT_INITIAL_VALUE

    public static final int DEFAULT_INITIAL_VALUE

See Also:
  Constant Field Values

### INCREMENT_PARAM

    public static final String INCREMENT_PARAM

See Also:
  Constant Field Values

### DEFAULT_INCREMENT_SIZE

    public static final int DEFAULT_INCREMENT_SIZE

See Also:
  Constant Field Values

### OPT_PARAM

    public static final String OPT_PARAM

See Also:
  Constant Field Values

Constructor Detail

### TableGenerator

    public TableGenerator()

Method Detail

### generatorKey

    public Object generatorKey()

  Description copied from interface: `PersistentIdentifierGenerator`
  Return a key unique to the underlying database objects. Prevents us from trying to create/remove them multiple times.

  Specified by:
    `generatorKey` in interface `PersistentIdentifierGenerator`
  Returns:
    Object an identifying key for this generator

### getIdentifierType

    public final Type getIdentifierType()

  Type mapping for the identifier.

  Returns:
    The identifier type mapping.

### getTableName

    public final String getTableName()

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

  Returns:
    The table name.

### 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.

  Returns:
    The segment column name

### 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.

  Returns:
    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'

  Returns:
    the column size.

### getValueColumnName

    public final String 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 the `optimizer` being used.

  Returns:
    The increment amount.

### getOptimizer

    public final Optimizer 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

    public void configure(Type type,
                          Properties params,
                          Dialect dialect)
                   throws MappingException

  Description copied from interface: `Configurable`
  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:
    `configure` in interface `Configurable`
    `params` - param values, keyed by parameter name
  Throws:
    `MappingException`

### determineGeneratorTableName

    protected String determineGeneratorTableName(Properties params,
                                                 Dialect dialect)

  Determine the table name to use for the generator values.

  Called during `configuration`.

  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:
    `getTableName()`

### determineSegmentColumnName

    protected String determineSegmentColumnName(Properties params,
                                                Dialect dialect)

  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` - 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:
    `getSegmentColumnName()`

### determineValueColumnName

    protected String determineValueColumnName(Properties params,
                                              Dialect dialect)

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

  Called during `configuration`.

  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:
    `getValueColumnName()`

### determineSegmentValue

    protected String determineSegmentValue(Properties params)

  Determine the segment value corresponding to this generator instance.

  Called during `configuration`.

  Parameters:
    `params` - The params supplied in the generator config (plus some standard useful extras).
  Returns:
    The name of the value column
  See Also:
    `getSegmentValue()`

### determineDefaultSegmentValue

    protected String determineDefaultSegmentValue(Properties params)

  Used in the cases where `determineSegmentValue(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

    protected int determineSegmentColumnSize(Properties params)

  Determine the size of the `segment column`

  Called during `configuration`.

  Parameters:
    `params` - The params supplied in the generator config (plus some standard useful extras).
  Returns:
    The size of the segment column
  See Also:
    `getSegmentValueLength()`

### determineInitialValue

    protected int determineInitialValue(Properties params)

### determineIncrementSize

    protected int determineIncrementSize(Properties params)

### buildSelectQuery

    protected String buildSelectQuery(Dialect dialect)

### buildUpdateQuery

    protected String buildUpdateQuery()

### buildInsertQuery

    protected String buildInsertQuery()

### generate

    public Serializable generate(SessionImplementor session,
                                 Object obj)

  Description copied from interface: `IdentifierGenerator`
  Generate a new identifier.

  Specified by:
    `generate` in interface `IdentifierGenerator`
    `obj` - the entity or toplevel collection for which the id is being generated
  Returns:
    a new identifier

### sqlCreateStrings

    public String[] sqlCreateStrings(Dialect dialect)
                              throws HibernateException

  Description copied from interface: `PersistentIdentifierGenerator`
  The SQL required to create the underlying database objects.

  Specified by:
    `sqlCreateStrings` in interface `PersistentIdentifierGenerator`
  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

    public String[] sqlDropStrings(Dialect dialect)
                            throws HibernateException

  Description copied from interface: `PersistentIdentifierGenerator`
  The SQL required to remove the underlying database objects.

  Specified by:
    `sqlDropStrings` in interface `PersistentIdentifierGenerator`
  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)

Copyright © 2001-2012 Red Hat, Inc. All Rights Reserved.