Skip to content

Commit f9d3611

Browse files
committed
HHH-18620 - Add @NativeGenerator
1 parent 3e0568a commit f9d3611

File tree

5 files changed

+149
-90
lines changed

5 files changed

+149
-90
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@
3030
@IdGeneratorType(org.hibernate.id.NativeGenerator.class)
3131
@Incubating
3232
public @interface NativeGenerator {
33+
/**
34+
* Configures the sequence generation when the dialect reports
35+
* {@linkplain jakarta.persistence.GenerationType#SEQUENCE} as
36+
* its native generator
37+
*/
3338
SequenceGenerator sequenceForm() default @SequenceGenerator();
39+
40+
/**
41+
* Configures the table generation when the dialect reports
42+
* {@linkplain jakarta.persistence.GenerationType#TABLE} as
43+
* its native generator
44+
*/
3445
TableGenerator tableForm() default @TableGenerator();
3546
}

hibernate-core/src/main/java/org/hibernate/boot/models/HibernateAnnotations.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ public interface HibernateAnnotations {
438438
Nationalized.class,
439439
NationalizedAnnotation.class
440440
);
441+
OrmAnnotationDescriptor<NativeGenerator, NativeGeneratorAnnotation> NATIVE_GENERATOR = new OrmAnnotationDescriptor<>(
442+
NativeGenerator.class,
443+
NativeGeneratorAnnotation.class
444+
);
441445
OrmAnnotationDescriptor<NaturalId, NaturalIdAnnotation> NATURAL_ID = new OrmAnnotationDescriptor<>(
442446
NaturalId.class,
443447
NaturalIdAnnotation.class
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
6+
*/
7+
package org.hibernate.boot.models.annotations.internal;
8+
9+
import jakarta.persistence.SequenceGenerator;
10+
import jakarta.persistence.TableGenerator;
11+
import org.hibernate.annotations.NativeGenerator;
12+
import org.hibernate.boot.model.internal.GeneratorStrategies;
13+
import org.hibernate.models.spi.SourceModelBuildingContext;
14+
15+
import java.lang.annotation.Annotation;
16+
import java.util.Map;
17+
18+
@SuppressWarnings({ "ClassExplicitlyAnnotation", "unused" })
19+
@jakarta.annotation.Generated("org.hibernate.orm.build.annotations.ClassGeneratorProcessor")
20+
public class NativeGeneratorAnnotation implements NativeGenerator {
21+
private SequenceGenerator sequenceForm;
22+
private TableGenerator tableForm;
23+
24+
/**
25+
* Used in legacy hbm.xml handling. See {@linkplain GeneratorStrategies#generatorClass}
26+
*/
27+
public NativeGeneratorAnnotation() {
28+
this.sequenceForm = new SequenceGeneratorJpaAnnotation( null );
29+
this.tableForm = new TableGeneratorJpaAnnotation( null );
30+
}
31+
32+
/**
33+
* Used in creating dynamic annotation instances (e.g. from XML)
34+
*/
35+
public NativeGeneratorAnnotation(SourceModelBuildingContext modelContext) {
36+
this.sequenceForm = new SequenceGeneratorJpaAnnotation( modelContext );
37+
this.tableForm = new TableGeneratorJpaAnnotation( modelContext );
38+
}
39+
40+
/**
41+
* Used in creating annotation instances from JDK variant
42+
*/
43+
public NativeGeneratorAnnotation(NativeGenerator annotation, SourceModelBuildingContext modelContext) {
44+
this.sequenceForm = annotation.sequenceForm();
45+
this.tableForm = annotation.tableForm();
46+
}
47+
48+
/**
49+
* Used in creating annotation instances from Jandex variant
50+
*/
51+
public NativeGeneratorAnnotation(Map<String, Object> attributeValues, SourceModelBuildingContext modelContext) {
52+
this.sequenceForm = (SequenceGenerator) attributeValues.get( "sequenceForm" );
53+
this.tableForm = (TableGenerator) attributeValues.get( "tableForm" );
54+
}
55+
56+
@Override
57+
public SequenceGenerator sequenceForm() {
58+
return sequenceForm;
59+
}
60+
61+
public void sequenceForm(SequenceGenerator sequenceForm) {
62+
this.sequenceForm = sequenceForm;
63+
}
64+
65+
@Override
66+
public TableGenerator tableForm() {
67+
return tableForm;
68+
}
69+
70+
public void tableForm(TableGenerator tableForm) {
71+
this.tableForm = tableForm;
72+
}
73+
74+
@Override
75+
public Class<? extends Annotation> annotationType() {
76+
return NativeGenerator.class;
77+
}
78+
}

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

Lines changed: 49 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,9 @@
44
*/
55
package org.hibernate.dialect;
66

7-
import java.io.IOException;
8-
import java.io.InputStream;
9-
import java.io.OutputStream;
10-
import java.io.Reader;
11-
import java.lang.invoke.MethodHandles;
12-
import java.sql.Blob;
13-
import java.sql.CallableStatement;
14-
import java.sql.Clob;
15-
import java.sql.Connection;
16-
import java.sql.DatabaseMetaData;
17-
import java.sql.NClob;
18-
import java.sql.PreparedStatement;
19-
import java.sql.ResultSet;
20-
import java.sql.ResultSetMetaData;
21-
import java.sql.SQLException;
22-
import java.sql.Timestamp;
23-
import java.sql.Types;
24-
import java.time.Duration;
25-
import java.time.Instant;
26-
import java.time.LocalDate;
27-
import java.time.LocalDateTime;
28-
import java.time.LocalTime;
29-
import java.time.OffsetDateTime;
30-
import java.time.temporal.TemporalAccessor;
31-
import java.util.Calendar;
32-
import java.util.Date;
33-
import java.util.HashSet;
34-
import java.util.List;
35-
import java.util.Locale;
36-
import java.util.Map;
37-
import java.util.Objects;
38-
import java.util.Properties;
39-
import java.util.Set;
40-
import java.util.TimeZone;
41-
import java.util.UUID;
42-
import java.util.regex.Matcher;
43-
import java.util.regex.Pattern;
44-
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.TemporalType;
9+
import org.checkerframework.checker.nullness.qual.Nullable;
4510
import org.hibernate.HibernateException;
4611
import org.hibernate.Incubating;
4712
import org.hibernate.Length;
@@ -67,9 +32,9 @@
6732
import org.hibernate.dialect.function.InsertSubstringOverlayEmulation;
6833
import org.hibernate.dialect.function.LocatePositionEmulation;
6934
import org.hibernate.dialect.function.LpadRpadPadEmulation;
35+
import org.hibernate.dialect.function.OrdinalFunction;
7036
import org.hibernate.dialect.function.SqlFunction;
7137
import org.hibernate.dialect.function.TrimFunction;
72-
import org.hibernate.dialect.function.OrdinalFunction;
7338
import org.hibernate.dialect.identity.IdentityColumnSupport;
7439
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
7540
import org.hibernate.dialect.lock.LockingStrategy;
@@ -195,12 +160,45 @@
195160
import org.hibernate.type.descriptor.sql.internal.DdlTypeImpl;
196161
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
197162
import org.hibernate.type.spi.TypeConfiguration;
198-
199163
import org.jboss.logging.Logger;
200164

201-
import jakarta.persistence.GenerationType;
202-
import jakarta.persistence.TemporalType;
203-
import org.checkerframework.checker.nullness.qual.Nullable;
165+
import java.io.IOException;
166+
import java.io.InputStream;
167+
import java.io.OutputStream;
168+
import java.io.Reader;
169+
import java.lang.invoke.MethodHandles;
170+
import java.sql.Blob;
171+
import java.sql.CallableStatement;
172+
import java.sql.Clob;
173+
import java.sql.Connection;
174+
import java.sql.DatabaseMetaData;
175+
import java.sql.NClob;
176+
import java.sql.PreparedStatement;
177+
import java.sql.ResultSet;
178+
import java.sql.ResultSetMetaData;
179+
import java.sql.SQLException;
180+
import java.sql.Timestamp;
181+
import java.sql.Types;
182+
import java.time.Duration;
183+
import java.time.Instant;
184+
import java.time.LocalDate;
185+
import java.time.LocalDateTime;
186+
import java.time.LocalTime;
187+
import java.time.OffsetDateTime;
188+
import java.time.temporal.TemporalAccessor;
189+
import java.util.Calendar;
190+
import java.util.Date;
191+
import java.util.HashSet;
192+
import java.util.List;
193+
import java.util.Locale;
194+
import java.util.Map;
195+
import java.util.Objects;
196+
import java.util.Properties;
197+
import java.util.Set;
198+
import java.util.TimeZone;
199+
import java.util.UUID;
200+
import java.util.regex.Matcher;
201+
import java.util.regex.Pattern;
204202

205203
import static java.lang.Math.ceil;
206204
import static java.lang.Math.log;
@@ -209,44 +207,7 @@
209207
import static org.hibernate.cfg.AvailableSettings.USE_GET_GENERATED_KEYS;
210208
import static org.hibernate.internal.util.StringHelper.splitAtCommas;
211209
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
212-
import static org.hibernate.type.SqlTypes.ARRAY;
213-
import static org.hibernate.type.SqlTypes.BIGINT;
214-
import static org.hibernate.type.SqlTypes.BINARY;
215-
import static org.hibernate.type.SqlTypes.BLOB;
216-
import static org.hibernate.type.SqlTypes.BOOLEAN;
217-
import static org.hibernate.type.SqlTypes.CHAR;
218-
import static org.hibernate.type.SqlTypes.CLOB;
219-
import static org.hibernate.type.SqlTypes.DATE;
220-
import static org.hibernate.type.SqlTypes.DECIMAL;
221-
import static org.hibernate.type.SqlTypes.DOUBLE;
222-
import static org.hibernate.type.SqlTypes.FLOAT;
223-
import static org.hibernate.type.SqlTypes.INTEGER;
224-
import static org.hibernate.type.SqlTypes.LONG32NVARCHAR;
225-
import static org.hibernate.type.SqlTypes.LONG32VARBINARY;
226-
import static org.hibernate.type.SqlTypes.LONG32VARCHAR;
227-
import static org.hibernate.type.SqlTypes.NCHAR;
228-
import static org.hibernate.type.SqlTypes.NCLOB;
229-
import static org.hibernate.type.SqlTypes.NUMERIC;
230-
import static org.hibernate.type.SqlTypes.NVARCHAR;
231-
import static org.hibernate.type.SqlTypes.REAL;
232-
import static org.hibernate.type.SqlTypes.ROWID;
233-
import static org.hibernate.type.SqlTypes.SMALLINT;
234-
import static org.hibernate.type.SqlTypes.TIME;
235-
import static org.hibernate.type.SqlTypes.TIMESTAMP;
236-
import static org.hibernate.type.SqlTypes.TIMESTAMP_UTC;
237-
import static org.hibernate.type.SqlTypes.TIMESTAMP_WITH_TIMEZONE;
238-
import static org.hibernate.type.SqlTypes.TIME_UTC;
239-
import static org.hibernate.type.SqlTypes.TIME_WITH_TIMEZONE;
240-
import static org.hibernate.type.SqlTypes.TINYINT;
241-
import static org.hibernate.type.SqlTypes.VARBINARY;
242-
import static org.hibernate.type.SqlTypes.VARCHAR;
243-
import static org.hibernate.type.SqlTypes.isCharacterType;
244-
import static org.hibernate.type.SqlTypes.isEnumType;
245-
import static org.hibernate.type.SqlTypes.isFloatOrRealOrDouble;
246-
import static org.hibernate.type.SqlTypes.isIntegral;
247-
import static org.hibernate.type.SqlTypes.isNumericOrDecimal;
248-
import static org.hibernate.type.SqlTypes.isVarbinaryType;
249-
import static org.hibernate.type.SqlTypes.isVarcharType;
210+
import static org.hibernate.type.SqlTypes.*;
250211
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_END;
251212
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_DATE;
252213
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_TIME;
@@ -2057,6 +2018,9 @@ public LobMergeStrategy getLobMergeStrategy() {
20572018
* @return The name identifying the native generator strategy.
20582019
*
20592020
* @deprecated Use {@linkplain #getNativeValueGenerationStrategy()} instead
2021+
*
2022+
* @implNote Only used with {@code hbm.xml} and {@linkplain org.hibernate.annotations.GenericGenerator},
2023+
* both of which have been deprecated
20602024
*/
20612025
@Deprecated(since = "7.0", forRemoval = true)
20622026
public String getNativeIdentifierGeneratorStrategy() {
@@ -2065,7 +2029,11 @@ public String getNativeIdentifierGeneratorStrategy() {
20652029

20662030
/**
20672031
* The native type of generation supported by this Dialect.
2032+
*
2033+
* @see org.hibernate.annotations.NativeGenerator
2034+
* @since 7.0
20682035
*/
2036+
@Incubating
20692037
public GenerationType getNativeValueGenerationStrategy() {
20702038
return getIdentityColumnSupport().supportsIdentityColumns()
20712039
? GenerationType.IDENTITY

hibernate-core/src/main/java/org/hibernate/id/NativeGenerator.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@
44
*/
55
package org.hibernate.id;
66

7-
import java.lang.reflect.Member;
8-
import java.util.EnumSet;
9-
import java.util.Map;
10-
import java.util.Properties;
11-
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.SequenceGenerator;
129
import org.hibernate.boot.model.internal.GeneratorParameters;
1310
import org.hibernate.boot.model.relational.Database;
1411
import org.hibernate.boot.model.relational.ExportableProducer;
1512
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
16-
import org.hibernate.boot.models.annotations.internal.UuidGeneratorAnnotation;
1713
import org.hibernate.dialect.Dialect;
1814
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1915
import org.hibernate.generator.AnnotationBasedGenerator;
@@ -29,8 +25,10 @@
2925
import org.hibernate.mapping.SimpleValue;
3026
import org.hibernate.persister.entity.EntityPersister;
3127

32-
import jakarta.persistence.GenerationType;
33-
import jakarta.persistence.SequenceGenerator;
28+
import java.lang.reflect.Member;
29+
import java.util.EnumSet;
30+
import java.util.Map;
31+
import java.util.Properties;
3432

3533
import static org.hibernate.id.IdentifierGenerator.GENERATOR_NAME;
3634
import static org.hibernate.id.OptimizableGenerator.INCREMENT_PARAM;
@@ -84,7 +82,7 @@ public void initialize(
8482
break;
8583
}
8684
case UUID: {
87-
dialectNativeGenerator = new UuidGenerator( new UuidGeneratorAnnotation( null ), member );
85+
dialectNativeGenerator = new UuidGenerator( context.getType().getReturnedClass() );
8886
break;
8987
}
9088
default: {

0 commit comments

Comments
 (0)