Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,40 +18,40 @@
* Allows to specify the target of a foreign-key using a "target attribute" as opposed to
* join column(s). E.g.
* <pre>
* {@code @Entity}
* &#64;Entity
* class Employee {
* {@code @Id}
* &#64;Id
* Integer id;
* {@code @Column(name="ssn") }
* &#64;Column(name="ssn")
* String socialSecurityNumber;
* }
* {@code @Entity}
* &#64;Entity
* class TaxDetails {
* {@code @Id Integer id;}
* {@code @OneToOne}
* {@code @PropertyRef("socialSecurityNumber")}
* &#64;Id Integer id;
* &#64;OneToOne
* &#64;PropertyRef("socialSecurityNumber")
* Employee employee;
* }
* </pre>
* Generally more useful with composite keys:
* <pre>
* {@code @Embeddable}
* &#64;Embeddable
* class Name {
* String first;
* String last;
* }
* {@code @Entity}
* &#64;Entity
* class Employee {
* {@code @Id}
* &#64;Id
* Integer id;
* {@code @Embedded}
* &#64;Embedded
* Name name;
* }
* {@code @Entity}
* &#64;Entity
* class TaxDetails {
* {@code @Id Integer id;}
* {@code @OneToOne}
* {@code @PropertyRef("name")}
* &#64;Id Integer id;
* &#64;OneToOne
* &#64;PropertyRef("name")
* Employee employee;
* }
* </pre>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,24 @@

import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.MappingException;
import org.hibernate.annotations.IdGeneratorType;
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.dialect.Dialect;
import org.hibernate.generator.Generator;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.models.spi.AnnotationTarget;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.MemberDetails;

import jakarta.persistence.GeneratedValue;

import static org.hibernate.boot.model.internal.GeneratorAnnotationHelper.handleIdGeneratorType;
import static org.hibernate.boot.model.internal.GeneratorAnnotationHelper.handleIdentityStrategy;
import static org.hibernate.boot.model.internal.GeneratorAnnotationHelper.locatePackageInfoDetails;
import static org.hibernate.boot.model.internal.GeneratorBinder.createGeneratorFrom;
import static org.hibernate.boot.model.internal.GeneratorParameters.identityTablesString;
import static org.hibernate.boot.model.internal.GeneratorStrategies.mapLegacyNamedGenerator;
import static org.hibernate.id.IdentifierGenerator.ENTITY_NAME;
Expand All @@ -35,6 +32,7 @@
import static org.hibernate.id.PersistentIdentifierGenerator.PK;
import static org.hibernate.id.PersistentIdentifierGenerator.TABLE;
import static org.hibernate.id.PersistentIdentifierGenerator.TABLES;
import static org.hibernate.internal.util.collections.CollectionHelper.size;

/**
* Template support for IdGeneratorResolver implementations dealing with entity identifiers
Expand Down Expand Up @@ -65,7 +63,7 @@ public AbstractEntityIdGeneratorResolver(
public final void doSecondPass(Map<String, PersistentClass> persistentClasses) throws MappingException {
switch ( generatedValue.strategy() ) {
case UUID -> handleUuidStrategy();
case IDENTITY -> GeneratorAnnotationHelper.handleIdentityStrategy( idValue );
case IDENTITY -> handleIdentityStrategy( idValue );
case SEQUENCE -> handleSequenceStrategy();
case TABLE -> handleTableStrategy();
case AUTO -> handleAutoStrategy();
Expand Down Expand Up @@ -134,7 +132,8 @@ protected boolean handleAsMetaAnnotated() {
return true;
}

final ClassDetails packageInfoDetails = GeneratorAnnotationHelper.locatePackageInfoDetails( idMember.getDeclaringType(), buildingContext );
final var packageInfoDetails =
locatePackageInfoDetails( idMember.getDeclaringType(), buildingContext );
if ( packageInfoDetails != null ) {
final Annotation fromPackage = findGeneratorAnnotation( packageInfoDetails );
if ( fromPackage != null ) {
Expand All @@ -147,26 +146,23 @@ protected boolean handleAsMetaAnnotated() {
}

private Annotation findGeneratorAnnotation(AnnotationTarget annotationTarget) {
final List<? extends Annotation> metaAnnotated =
final var metaAnnotated =
annotationTarget.getMetaAnnotated( IdGeneratorType.class,
buildingContext.getBootstrapContext().getModelsContext() );
if ( CollectionHelper.size( metaAnnotated ) > 0 ) {
return metaAnnotated.get( 0 );
}
return size( metaAnnotated ) > 0 ? metaAnnotated.get( 0 ) : null;

return null;
}

protected boolean handleAsLegacyGenerator() {
// Handle a few legacy Hibernate generators...
final String nameFromGeneratedValue = generatedValue.generator();
if ( !nameFromGeneratedValue.isBlank() ) {
final Class<? extends Generator> legacyNamedGenerator =
final var legacyNamedGenerator =
mapLegacyNamedGenerator( nameFromGeneratedValue, idValue );
if ( legacyNamedGenerator != null ) {
final Map<String,String> configuration = buildLegacyGeneratorConfig();
final var configuration = buildLegacyGeneratorConfig();
//noinspection unchecked,rawtypes
GeneratorBinder.createGeneratorFrom(
createGeneratorFrom(
new IdentifierGeneratorDefinition( nameFromGeneratedValue,
legacyNamedGenerator.getName(), configuration ),
idValue,
Expand All @@ -181,15 +177,15 @@ protected boolean handleAsLegacyGenerator() {
}

private HashMap<String, String> buildLegacyGeneratorConfig() {
final Database database = buildingContext.getMetadataCollector().getDatabase();
final Dialect dialect = database.getDialect();
final var database = buildingContext.getMetadataCollector().getDatabase();
final var dialect = database.getDialect();

final HashMap<String, String> configuration = new HashMap<>();

final String tableName = idValue.getTable().getQuotedName( dialect );
configuration.put( TABLE, tableName );

final Column idColumn = (Column) idValue.getSelectables().get( 0);
final var idColumn = (Column) idValue.getSelectables().get( 0);
final String idColumnName = idColumn.getQuotedName( dialect );
configuration.put( PK, idColumnName );

Expand Down
Loading