Class SelectGenerator

  • All Implemented Interfaces:
    Serializable, Generator, OnExecutionGenerator, BulkInsertionCapableIdentifierGenerator, Configurable, StandardGenerator, PostInsertIdentifierGenerator

    public class SelectGenerator
    extends Object
    implements PostInsertIdentifierGenerator, BulkInsertionCapableIdentifierGenerator, StandardGenerator
    A generator that selects the just-inserted row to determine the column value assigned by the database. The correct row is located using a unique key of the entity, either:
    • the mapped NaturalId of the entity, or
    • a property specified using the parameter named "key".

    The second approach is provided for backward compatibility with older versions of Hibernate.

    This generator is intended for use with primary keys assigned by a database trigger or something similar, for example:

     @Entity @Table(name="TableWithPKAssignedByTrigger")
     @GenericGenerator(name = "triggered", type = SelectGenerator.class)
     public class TriggeredEntity {
         @Id @GeneratedValue(generator = "triggered")
         private Long id;
    
         @NaturalId
         private String name;
    
         ...
     }
     

    However, after a very long working life, this generator is now handing over its work to GeneratedGeneration, and the above code may be written as:

     @Entity @Table(name="TableWithPKAssignedByTrigger")
     public class TriggeredEntity {
         @Id @Generated
         private Long id;
    
         @NaturalId
         private String name;
    
         ...
     }
     

    For tables with identity/autoincrement columns, use IdentityGenerator.

    The actual work involved in retrieving the primary key value is the job of UniqueKeySelectingDelegate.

    Arguably, this class breaks the natural separation of responsibility between the generator and the coordinating code, since its role is to specify how the generated value is retrieved.

    See Also:
    NaturalId, UniqueKeySelectingDelegate, Serialized Form
    Implementation Note:
    This also implements the select generation type in hbm.xml mappings.
    • Constructor Detail

      • SelectGenerator

        public SelectGenerator()
    • Method Detail

      • getUniqueKeyPropertyNames

        public String[] getUniqueKeyPropertyNames​(EntityPersister persister)
        Description copied from interface: OnExecutionGenerator
        The name of a property of the entity which may be used to locate the just-inserted row containing the generated value. Of course, the columns mapped by this property should form a unique key of the entity.

        The default implementation uses the @NaturalId property, if there is one.

        Specified by:
        getUniqueKeyPropertyNames in interface OnExecutionGenerator
      • referenceColumnsInSql

        public boolean referenceColumnsInSql​(Dialect dialect)
        Description copied from interface: OnExecutionGenerator
        Determines if the columns whose values are generated are included in the column list of the SQL insert or update statement. For example, this method should return:
        Specified by:
        referenceColumnsInSql in interface OnExecutionGenerator
        Returns:
        true if the column is included in the column list of the SQL statement.
      • getReferencedColumnValues

        public String[] getReferencedColumnValues​(Dialect dialect)
        Description copied from interface: OnExecutionGenerator
        A SQL expression indicating how to calculate the generated values when the mapped columns are included in the SQL statement. The SQL expressions might be:
        • function calls like current_timestamp or nextval('mysequence'), or
        • syntactic markers like default.
        Specified by:
        getReferencedColumnValues in interface OnExecutionGenerator
        Parameters:
        dialect - The SQL dialect, allowing generation of an expression in dialect-specific SQL.
        Returns:
        The column value to be used in the generated SQL statement.