Skip to content

Commit 64d0cf8

Browse files
committed
rename Generator subtypes to BeforeExecuteGenerator and OnExecuteGenerator
- and update javadocs - add/improve doc of new Dialect methods - add some missing @OverRide annotations
1 parent f3e31fe commit 64d0cf8

File tree

47 files changed

+247
-202
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+247
-202
lines changed

hibernate-core/src/main/java/org/hibernate/annotations/IdGeneratorType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* <p>
2424
* For example, if we have a custom identifier generator:
2525
* <pre>{@code
26-
* public class CustomSequenceGenerator implements InMemoryGenerator {
26+
* public class CustomSequenceGenerator implements BeforeExecutionGenerator {
2727
* public CustomSequenceGenerator(CustomSequence config, Member annotatedMember,
2828
* CustomIdGeneratorCreationContext context) {
2929
* ...

hibernate-core/src/main/java/org/hibernate/annotations/ValueGenerationType.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
import org.hibernate.generator.AnnotationBasedGenerator;
1414
import org.hibernate.generator.Generator;
15-
import org.hibernate.generator.InDatabaseGenerator;
16-
import org.hibernate.generator.InMemoryGenerator;
15+
import org.hibernate.generator.OnExecutionGenerator;
16+
import org.hibernate.generator.BeforeExecutionGenerator;
1717
import org.hibernate.generator.internal.TenantIdGeneration;
1818

1919
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
@@ -50,9 +50,9 @@
5050
* Every generator annotation type has an {@link Generator} implementation which
5151
* is responsible for generating values. It must be either:
5252
* <ul>
53-
* <li>an {@link InMemoryGenerator}, for values that are generated in Java code,
53+
* <li>an {@link BeforeExecutionGenerator}, for values that are generated in Java code,
5454
* using a {@link org.hibernate.tuple.ValueGenerator}, or
55-
* <li>an {@link InDatabaseGenerator}, for values which are generated by the
55+
* <li>an {@link OnExecutionGenerator}, for values which are generated by the
5656
* database.
5757
* </ul>
5858
* A generator annotation may have members, which are used to configure the
@@ -70,8 +70,8 @@
7070
* {@link RetentionPolicy#RUNTIME}.
7171
*
7272
* @see Generator
73-
* @see InMemoryGenerator
74-
* @see InDatabaseGenerator
73+
* @see BeforeExecutionGenerator
74+
* @see OnExecutionGenerator
7575
* @see AnnotationBasedGenerator
7676
*
7777
* @author Gunnar Morling

hibernate-core/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
import org.hibernate.generator.Generator;
5050
import org.hibernate.binder.AttributeBinder;
5151
import org.hibernate.generator.GeneratorCreationContext;
52-
import org.hibernate.generator.InDatabaseGenerator;
53-
import org.hibernate.generator.InMemoryGenerator;
52+
import org.hibernate.generator.OnExecutionGenerator;
53+
import org.hibernate.generator.BeforeExecutionGenerator;
5454
import org.jboss.logging.Logger;
5555

5656
import java.lang.annotation.Annotation;
@@ -452,10 +452,10 @@ private GeneratorCreator getValueGenerationFromAnnotations(XProperty property) {
452452
}
453453

454454
private static void checkGeneratorClass(Class<? extends Generator> generatorClass) {
455-
if ( !InMemoryGenerator.class.isAssignableFrom( generatorClass )
456-
&& !InDatabaseGenerator.class.isAssignableFrom( generatorClass ) ) {
455+
if ( !BeforeExecutionGenerator.class.isAssignableFrom( generatorClass )
456+
&& !OnExecutionGenerator.class.isAssignableFrom( generatorClass ) ) {
457457
throw new MappingException("Generator class '" + generatorClass.getName()
458-
+ "' must implement either 'InMemoryGenerator' or 'InDatabaseGenerator'");
458+
+ "' must implement either 'BeforeExecutionGenerator' or 'OnExecutionGenerator'");
459459
}
460460
}
461461

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3436,17 +3436,47 @@ public boolean supportsSubqueryInSelect() {
34363436
}
34373437

34383438
/**
3439-
* Does this dialect fully support {@code insert ... returning ...} in some form?
3439+
* Does this dialect fully support returning arbitrary generated column values
3440+
* after execution of an {@code insert} statement, using native SQL syntax?
3441+
* <p>
3442+
* Support for identity columns is insufficient here, we require something like:
3443+
* <ol>
3444+
* <li>{@code insert ... returning ...}
3445+
* <li>{@code select from final table (insert ... )}
3446+
* </ol>
34403447
*
34413448
* @return {@code true} if {@link org.hibernate.id.insert.InsertReturningDelegate}
34423449
* works for any sort of primary key column (not just identity columns), or
34433450
* {@code false} if {@code InsertReturningDelegate} does not work, or only
34443451
* works for specialized identity/"autoincrement" columns
3452+
*
3453+
* @see org.hibernate.generator.OnExecutionGenerator#getGeneratedIdentifierDelegate
3454+
* @see org.hibernate.id.insert.InsertReturningDelegate
3455+
*
3456+
* @since 6.2
34453457
*/
34463458
public boolean supportsInsertReturning() {
34473459
return false;
34483460
}
34493461

3462+
/**
3463+
* Does this dialect fully support returning arbitrary generated column values
3464+
* after execution of an {@code insert} statement, using the JDBC method
3465+
* {@link Connection#prepareStatement(String, String[])}.
3466+
* <p>
3467+
* Support for returning the generated value of an identity column via the JDBC
3468+
* method {@link Connection#prepareStatement(String, int)} is insufficient here.
3469+
*
3470+
* @return {@code true} if {@link org.hibernate.id.insert.GetGeneratedKeysDelegate}
3471+
* works for any sort of primary key column (not just identity columns), or
3472+
* {@code false} if {@code GetGeneratedKeysDelegate} does not work, or only
3473+
* works for specialized identity/"autoincrement" columns
3474+
*
3475+
* @see org.hibernate.generator.OnExecutionGenerator#getGeneratedIdentifierDelegate
3476+
* @see org.hibernate.id.insert.GetGeneratedKeysDelegate
3477+
*
3478+
* @since 6.2
3479+
*/
34503480
public boolean supportsInsertReturningGeneratedKeys() {
34513481
return false;
34523482
}

hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ public static TemporaryTable createEntityTable(
274274
.getEntityBinding( entityDescriptor.getEntityName() );
275275

276276
final Generator identifierGenerator = entityDescriptor.getEntityPersister().getGenerator();
277-
final boolean identityColumn = identifierGenerator.generatedByDatabase();
277+
final boolean identityColumn = identifierGenerator.generatedOnExecute();
278278
final boolean hasOptimizer;
279279
if ( identityColumn ) {
280280
hasOptimizer = false;

hibernate-core/src/main/java/org/hibernate/event/internal/AbstractSaveEventListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.hibernate.persister.entity.EntityPersister;
3434
import org.hibernate.pretty.MessageHelper;
3535
import org.hibernate.generator.Generator;
36-
import org.hibernate.generator.InMemoryGenerator;
36+
import org.hibernate.generator.BeforeExecutionGenerator;
3737
import org.hibernate.type.Type;
3838
import org.hibernate.type.TypeHelper;
3939

@@ -116,8 +116,8 @@ protected Object saveWithGeneratedId(
116116

117117
final EntityPersister persister = source.getEntityPersister( entityName, entity );
118118
Generator generator = persister.getGenerator();
119-
if ( !generator.generatedByDatabase() ) {
120-
final Object generatedId = ( (InMemoryGenerator) generator ).generate( source, entity, null, INSERT );
119+
if ( !generator.generatedOnExecute() ) {
120+
final Object generatedId = ( (BeforeExecutionGenerator) generator ).generate( source, entity, null, INSERT );
121121
if ( generatedId == null ) {
122122
throw new IdentifierGenerationException( "null id generated for: " + entity.getClass() );
123123
}

hibernate-core/src/main/java/org/hibernate/generator/AnnotationBasedGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
* {@code AnnotationType} is the generator annotation type used to configure the
3030
* generator.
3131
* <p>
32-
* Every instance of this class must implement either {@link InMemoryGenerator} or
33-
* {@link InDatabaseGenerator}.
32+
* Every instance of this class must implement either {@link BeforeExecutionGenerator} or
33+
* {@link OnExecutionGenerator}.
3434
*
3535
* @param <A> The generator annotation type supported by an implementation
3636
*

hibernate-core/src/main/java/org/hibernate/generator/InMemoryGenerator.java renamed to hibernate-core/src/main/java/org/hibernate/generator/BeforeExecutionGenerator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* database via a parameter of a JDBC prepared statement, just like any other field or property
1616
* value.
1717
* <p>
18-
* Any {@link InMemoryGenerator} with {@linkplain #getEventTypes() generation event types}
18+
* Any {@link BeforeExecutionGenerator} with {@linkplain #getEventTypes() generation event types}
1919
* {@link EventTypeSets#INSERT_ONLY} may be used to produce {@linkplain jakarta.persistence.Id
2020
* identifiers}. The built-in identifier generators all implement the older extension point
2121
* {@link org.hibernate.id.IdentifierGenerator}, which is a subtype of this interface, but that
@@ -30,10 +30,11 @@
3030
* {@link org.hibernate.annotations.ValueGenerationType}, as for any {@link Generator}.
3131
*
3232
* @author Steve Ebersole
33+
* @author Gavin King
3334
*
3435
* @since 6.2
3536
*/
36-
public interface InMemoryGenerator extends Generator {
37+
public interface BeforeExecutionGenerator extends Generator {
3738
/**
3839
* Generate a value.
3940
*
@@ -45,7 +46,8 @@ public interface InMemoryGenerator extends Generator {
4546
*/
4647
Object generate(SharedSessionContractImplementor session, Object owner, Object currentValue, EventType eventType);
4748

48-
default boolean generatedByDatabase() {
49+
@Override
50+
default boolean generatedOnExecute() {
4951
return false;
5052
}
5153
}

hibernate-core/src/main/java/org/hibernate/generator/Generator.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package org.hibernate.generator;
88

99
import org.hibernate.engine.spi.SharedSessionContractImplementor;
10-
import org.hibernate.tuple.ValueGenerator;
1110

1211
import java.io.Serializable;
1312
import java.util.EnumSet;
@@ -18,18 +17,22 @@
1817
/**
1918
* Describes the generation of values of a certain field or property of an entity. A generated
2019
* value might be generated in Java, or by the database. Every instance must implement either
21-
* {@link InMemoryGenerator} or {@link InDatabaseGenerator} depending on whether values are
22-
* generated in Java code, or by the database.
20+
* {@link BeforeExecutionGenerator} or {@link OnExecutionGenerator} depending on whether values
21+
* are generated in Java code before execution of a SQL statement, or by the database when the
22+
* SQL statement is executed.
2323
* <ul>
2424
* <li>Value generation via arbitrary code written in Java is the responsibility of the method
25-
* {@link InMemoryGenerator#generate(SharedSessionContractImplementor, Object, Object, EventType)}.
25+
* {@link BeforeExecutionGenerator#generate(SharedSessionContractImplementor, Object, Object, EventType)}.
2626
* In this case, the generated value is written to the database just like any other field
27-
* or property value.
27+
* or property value. The Java code may, of course, ask the database to actually generate
28+
* the value. Examples include timestamp generation using the JVM system time, and id
29+
* generation using a database sequence.
2830
* <li>A value generated by the database might be generated implicitly, by a trigger, or using
2931
* a {@code default} column value specified in DDL, for example, or it might be generated
3032
* by a SQL expression occurring explicitly in the SQL {@code insert} or {@code update}
31-
* statement. In this case, the generated value is retrieved from the database using a SQL
32-
* {@code select}.
33+
* statement. In this case, the generated value may be retrieved from the database using a
34+
* SQL {@code select}, though in certain cases this additional round trip may be avoided.
35+
* An important example is id generation using an identity column.
3336
* </ul>
3437
* Generically, a generator may be integrated with the program using the meta-annotation
3538
* {@link org.hibernate.annotations.ValueGenerationType}, which associates the generator with
@@ -71,12 +74,20 @@
7174
*/
7275
public interface Generator extends Serializable {
7376
/**
74-
* Determines if the property value is generated in Java, or by the database.
77+
* Determines if the property value is generated in Java code, or by the database.
78+
* <ul>
79+
* <li>Generators which only implement {@link BeforeExecutionGenerator} must result
80+
* {@code false}.
81+
* <li>Generators which only implement {@link OnExecutionGenerator} must result
82+
* {@code true}.
83+
* <li>Generators which implement both subinterfaces may decide at runtime what value
84+
* to return.
85+
* </ul>
7586
*
7687
* @return {@code true} if the value is generated by the database, or false if it is
77-
* generated in Java using a {@link ValueGenerator}.
88+
* generated in Java code.
7889
*/
79-
boolean generatedByDatabase();
90+
boolean generatedOnExecute();
8091

8192
/**
8293
* The {@linkplain EventType event types} for which this generator should be called

hibernate-core/src/main/java/org/hibernate/generator/InDatabaseGenerator.java renamed to hibernate-core/src/main/java/org/hibernate/generator/OnExecutionGenerator.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,18 @@
1818
import static org.hibernate.generator.internal.NaturalIdHelper.getNaturalIdPropertyNames;
1919

2020
/**
21+
* A generator which produces a new value by actually going ahead and writing a row to the
22+
* database, then retrieving the value which was generated by the database itself as a side
23+
* effect of the SQL {@code insert} or {@code update} statement which wrote the row.
24+
* <p>
2125
* A value generated by the database might be generated implicitly, by a trigger, or using
2226
* a {@code default} column value specified in DDL, for example, or it might be generated
2327
* by a SQL expression occurring explicitly in the SQL {@code insert} or {@code update}
24-
* statement. In this case, the generated value is retrieved from the database using a SQL
25-
* {@code select}.
28+
* statement.
29+
* <p>
30+
* The generated value is usually retrieved from the database using a SQL {@code select},
31+
* but in {@linkplain #getGeneratedIdentifierDelegate certain cases} this additional round
32+
* trip may be avoided.
2633
* <p>
2734
* Implementations should override {@link #referenceColumnsInSql(Dialect)},
2835
* {@link #writePropertyValue()}, and {@link #getReferencedColumnValues(Dialect)} as needed
@@ -34,10 +41,11 @@
3441
* implementation of {@link org.hibernate.id.insert.InsertGeneratedIdentifierDelegate}.
3542
*
3643
* @author Steve Ebersole
44+
* @author Gavin King
3745
*
3846
* @since 6.2
3947
*/
40-
public interface InDatabaseGenerator extends Generator {
48+
public interface OnExecutionGenerator extends Generator {
4149

4250
/**
4351
* Determines if the columns whose values are generated are included in the column list
@@ -133,7 +141,8 @@ default String[] getUniqueKeyPropertyNames(EntityPersister persister) {
133141
return getNaturalIdPropertyNames( persister );
134142
}
135143

136-
default boolean generatedByDatabase() {
144+
@Override
145+
default boolean generatedOnExecute() {
137146
return true;
138147
}
139148
}

hibernate-core/src/main/java/org/hibernate/generator/internal/CurrentTimestampGeneration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import org.hibernate.dialect.Dialect;
1515
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1616
import org.hibernate.generator.EventType;
17-
import org.hibernate.generator.InDatabaseGenerator;
18-
import org.hibernate.generator.InMemoryGenerator;
17+
import org.hibernate.generator.OnExecutionGenerator;
18+
import org.hibernate.generator.BeforeExecutionGenerator;
1919
import org.hibernate.internal.util.ReflectHelper;
2020
import org.hibernate.generator.GeneratorCreationContext;
2121
import org.hibernate.tuple.GenerationTiming;
@@ -46,7 +46,7 @@
4646
* @author Steve Ebersole
4747
* @author Gavin King
4848
*/
49-
public class CurrentTimestampGeneration implements InMemoryGenerator, InDatabaseGenerator {
49+
public class CurrentTimestampGeneration implements BeforeExecutionGenerator, OnExecutionGenerator {
5050
private final EnumSet<EventType> eventTypes;
5151
private final ValueGenerator<?> generator;
5252

@@ -80,7 +80,7 @@ private static ValueGenerator<?> getGenerator(SourceType source, Member member)
8080
}
8181

8282
@Override
83-
public boolean generatedByDatabase() {
83+
public boolean generatedOnExecute() {
8484
return generator == null;
8585
}
8686

hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedAlwaysGeneration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.hibernate.annotations.GeneratedColumn;
1010
import org.hibernate.dialect.Dialect;
1111
import org.hibernate.generator.EventType;
12-
import org.hibernate.generator.InDatabaseGenerator;
12+
import org.hibernate.generator.OnExecutionGenerator;
1313

1414
import java.util.EnumSet;
1515

@@ -20,7 +20,7 @@
2020
*
2121
* @author Gavin King
2222
*/
23-
public class GeneratedAlwaysGeneration implements InDatabaseGenerator {
23+
public class GeneratedAlwaysGeneration implements OnExecutionGenerator {
2424

2525
public GeneratedAlwaysGeneration() {}
2626

hibernate-core/src/main/java/org/hibernate/generator/internal/GeneratedGeneration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@
1010
import org.hibernate.annotations.GenerationTime;
1111
import org.hibernate.dialect.Dialect;
1212
import org.hibernate.generator.EventType;
13-
import org.hibernate.generator.InDatabaseGenerator;
13+
import org.hibernate.generator.OnExecutionGenerator;
1414

1515
import java.util.EnumSet;
1616

1717
import static org.hibernate.generator.EventTypeSets.fromArray;
1818
import static org.hibernate.internal.util.StringHelper.isEmpty;
1919

2020
/**
21-
* A fairly generic {@link InDatabaseGenerator} which marks a property as generated in the
21+
* A fairly generic {@link OnExecutionGenerator} which marks a property as generated in the
2222
* database with semantics given explicitly by a {@link Generated @Generated} annotation.
2323
*
2424
* @see Generated
2525
*
2626
* @author Steve Ebersole
2727
* @author Gunnar Morling
2828
*/
29-
public class GeneratedGeneration implements InDatabaseGenerator {
29+
public class GeneratedGeneration implements OnExecutionGenerator {
3030

3131
private final EnumSet<EventType> eventTypes;
3232
private final boolean writable;

hibernate-core/src/main/java/org/hibernate/generator/internal/SourceGeneration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.hibernate.generator.EventType;
1818
import org.hibernate.generator.EventTypeSets;
1919
import org.hibernate.generator.GeneratorCreationContext;
20-
import org.hibernate.generator.InMemoryGenerator;
20+
import org.hibernate.generator.BeforeExecutionGenerator;
2121
import org.hibernate.internal.CoreMessageLogger;
2222
import org.hibernate.tuple.TimestampGenerators;
2323
import org.hibernate.tuple.ValueGenerator;
@@ -52,7 +52,7 @@
5252
*/
5353
@Deprecated(since = "6.2")
5454
@Internal
55-
public class SourceGeneration implements InMemoryGenerator {
55+
public class SourceGeneration implements BeforeExecutionGenerator {
5656

5757
private static final CoreMessageLogger log = Logger.getMessageLogger(
5858
CoreMessageLogger.class,

0 commit comments

Comments
 (0)