HHH-18096 Support for JPA 3.2 database generator options
This commit is contained in:
parent
49964af5a9
commit
a76a4a585b
|
@ -134,7 +134,7 @@ public class GenerationStrategyInterpreter {
|
||||||
final String options = tableGeneratorAnnotation.getString( "options" );
|
final String options = tableGeneratorAnnotation.getString( "options" );
|
||||||
if ( StringHelper.isNotEmpty( options ) ) {
|
if ( StringHelper.isNotEmpty( options ) ) {
|
||||||
definitionBuilder.addParam(
|
definitionBuilder.addParam(
|
||||||
org.hibernate.id.enhanced.TableGenerator.TABLE_OPTIONS,
|
PersistentIdentifierGenerator.OPTIONS,
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -186,5 +186,10 @@ public class GenerationStrategyInterpreter {
|
||||||
SequenceStyleGenerator.INITIAL_PARAM,
|
SequenceStyleGenerator.INITIAL_PARAM,
|
||||||
String.valueOf( sequenceGeneratorAnnotation.getInteger( "initialValue" ) )
|
String.valueOf( sequenceGeneratorAnnotation.getInteger( "initialValue" ) )
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final String options = sequenceGeneratorAnnotation.getString( "options" );
|
||||||
|
if ( StringHelper.isNotEmpty( options ) ) {
|
||||||
|
definitionBuilder.addParam( PersistentIdentifierGenerator.OPTIONS, options );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,22 +27,16 @@ public class Sequence implements ContributableDatabaseObject {
|
||||||
private final QualifiedSequenceName name;
|
private final QualifiedSequenceName name;
|
||||||
private final String exportIdentifier;
|
private final String exportIdentifier;
|
||||||
private final String contributor;
|
private final String contributor;
|
||||||
|
private final int initialValue;
|
||||||
private int initialValue = 1;
|
private final int incrementSize;
|
||||||
private int incrementSize = 1;
|
private final String options;
|
||||||
|
|
||||||
public Sequence(
|
public Sequence(
|
||||||
String contributor,
|
String contributor,
|
||||||
Identifier catalogName,
|
Identifier catalogName,
|
||||||
Identifier schemaName,
|
Identifier schemaName,
|
||||||
Identifier sequenceName) {
|
Identifier sequenceName) {
|
||||||
this.contributor = contributor;
|
this( contributor, catalogName, schemaName, sequenceName, 1, 1, null );
|
||||||
this.name = new QualifiedSequenceName(
|
|
||||||
catalogName,
|
|
||||||
schemaName,
|
|
||||||
sequenceName
|
|
||||||
);
|
|
||||||
this.exportIdentifier = name.render();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Sequence(
|
public Sequence(
|
||||||
|
@ -52,9 +46,27 @@ public class Sequence implements ContributableDatabaseObject {
|
||||||
Identifier sequenceName,
|
Identifier sequenceName,
|
||||||
int initialValue,
|
int initialValue,
|
||||||
int incrementSize) {
|
int incrementSize) {
|
||||||
this( contributor, catalogName, schemaName, sequenceName );
|
this( contributor, catalogName, schemaName, sequenceName, initialValue, incrementSize, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sequence(
|
||||||
|
String contributor,
|
||||||
|
Identifier catalogName,
|
||||||
|
Identifier schemaName,
|
||||||
|
Identifier sequenceName,
|
||||||
|
int initialValue,
|
||||||
|
int incrementSize,
|
||||||
|
String options) {
|
||||||
|
this.contributor = contributor;
|
||||||
|
this.name = new QualifiedSequenceName(
|
||||||
|
catalogName,
|
||||||
|
schemaName,
|
||||||
|
sequenceName
|
||||||
|
);
|
||||||
|
this.exportIdentifier = name.render();
|
||||||
this.initialValue = initialValue;
|
this.initialValue = initialValue;
|
||||||
this.incrementSize = incrementSize;
|
this.incrementSize = incrementSize;
|
||||||
|
this.options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QualifiedSequenceName getName() {
|
public QualifiedSequenceName getName() {
|
||||||
|
@ -79,6 +91,10 @@ public class Sequence implements ContributableDatabaseObject {
|
||||||
return incrementSize;
|
return incrementSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getOptions() {
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
public void validate(int initialValue, int incrementSize) {
|
public void validate(int initialValue, int incrementSize) {
|
||||||
if ( this.initialValue != initialValue ) {
|
if ( this.initialValue != initialValue ) {
|
||||||
throw new HibernateException(
|
throw new HibernateException(
|
||||||
|
|
|
@ -29,7 +29,6 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistentAttribute;
|
||||||
import org.hibernate.boot.jaxb.mapping.spi.JaxbTenantIdImpl;
|
import org.hibernate.boot.jaxb.mapping.spi.JaxbTenantIdImpl;
|
||||||
import org.hibernate.boot.models.HibernateAnnotations;
|
import org.hibernate.boot.models.HibernateAnnotations;
|
||||||
import org.hibernate.boot.models.JpaAnnotations;
|
import org.hibernate.boot.models.JpaAnnotations;
|
||||||
import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle;
|
|
||||||
import org.hibernate.boot.models.xml.internal.attr.BasicAttributeProcessing;
|
import org.hibernate.boot.models.xml.internal.attr.BasicAttributeProcessing;
|
||||||
import org.hibernate.boot.models.xml.internal.attr.BasicIdAttributeProcessing;
|
import org.hibernate.boot.models.xml.internal.attr.BasicIdAttributeProcessing;
|
||||||
import org.hibernate.boot.models.xml.internal.attr.CommonAttributeProcessing;
|
import org.hibernate.boot.models.xml.internal.attr.CommonAttributeProcessing;
|
||||||
|
@ -55,7 +54,6 @@ import org.hibernate.models.spi.MutableMemberDetails;
|
||||||
import org.hibernate.models.spi.SourceModelBuildingContext;
|
import org.hibernate.models.spi.SourceModelBuildingContext;
|
||||||
import org.hibernate.models.spi.TypeDetails;
|
import org.hibernate.models.spi.TypeDetails;
|
||||||
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
|
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
|
||||||
import org.hibernate.property.access.spi.PropertyAccessStrategy;
|
|
||||||
|
|
||||||
import jakarta.persistence.Access;
|
import jakarta.persistence.Access;
|
||||||
import jakarta.persistence.AccessType;
|
import jakarta.persistence.AccessType;
|
||||||
|
@ -596,7 +594,13 @@ public class ManagedTypeProcessor {
|
||||||
jaxbEntity, classDetails, xmlDocumentContext
|
jaxbEntity, classDetails, xmlDocumentContext
|
||||||
);
|
);
|
||||||
|
|
||||||
XmlAnnotationHelper.applyTableGenerators( jaxbEntity.getTableGenerators(), classDetails, xmlDocumentContext );
|
XmlAnnotationHelper.applyTableGenerator( jaxbEntity.getTableGenerators(), classDetails, xmlDocumentContext );
|
||||||
|
|
||||||
|
XmlAnnotationHelper.applySequenceGenerator(
|
||||||
|
jaxbEntity.getSequenceGenerators(),
|
||||||
|
classDetails,
|
||||||
|
xmlDocumentContext
|
||||||
|
);
|
||||||
|
|
||||||
renderClass( classDetails, xmlDocumentContext );
|
renderClass( classDetails, xmlDocumentContext );
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,6 @@ import jakarta.persistence.SecondaryTables;
|
||||||
import jakarta.persistence.SequenceGenerator;
|
import jakarta.persistence.SequenceGenerator;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import jakarta.persistence.TableGenerator;
|
import jakarta.persistence.TableGenerator;
|
||||||
import jakarta.persistence.TableGenerators;
|
|
||||||
import jakarta.persistence.Temporal;
|
import jakarta.persistence.Temporal;
|
||||||
import jakarta.persistence.TemporalType;
|
import jakarta.persistence.TemporalType;
|
||||||
import jakarta.persistence.UniqueConstraint;
|
import jakarta.persistence.UniqueConstraint;
|
||||||
|
@ -564,6 +563,29 @@ public class XmlAnnotationHelper {
|
||||||
xmlDocumentContext.getModelBuildingContext()
|
xmlDocumentContext.getModelBuildingContext()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
applySequenceGeneratorAttributes( jaxbGenerator, sequenceAnn );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void applySequenceGenerator(
|
||||||
|
JaxbSequenceGeneratorImpl jaxbGenerator,
|
||||||
|
MutableClassDetails classDetails,
|
||||||
|
XmlDocumentContext xmlDocumentContext) {
|
||||||
|
if ( jaxbGenerator == null ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final MutableAnnotationUsage<SequenceGenerator> sequenceAnn = classDetails.replaceAnnotationUsage(
|
||||||
|
JpaAnnotations.SEQUENCE_GENERATOR,
|
||||||
|
xmlDocumentContext.getModelBuildingContext()
|
||||||
|
);
|
||||||
|
|
||||||
|
applySequenceGeneratorAttributes( jaxbGenerator, sequenceAnn );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void applySequenceGeneratorAttributes(
|
||||||
|
JaxbSequenceGeneratorImpl jaxbGenerator,
|
||||||
|
MutableAnnotationUsage<SequenceGenerator> sequenceAnn) {
|
||||||
|
XmlProcessingHelper.applyAttributeIfSpecified( "name", jaxbGenerator.getName(), sequenceAnn );
|
||||||
XmlProcessingHelper.applyAttributeIfSpecified( "sequenceName", jaxbGenerator.getSequenceName(), sequenceAnn );
|
XmlProcessingHelper.applyAttributeIfSpecified( "sequenceName", jaxbGenerator.getSequenceName(), sequenceAnn );
|
||||||
|
|
||||||
XmlProcessingHelper.applyAttributeIfSpecified( "catalog", jaxbGenerator.getCatalog(), sequenceAnn );
|
XmlProcessingHelper.applyAttributeIfSpecified( "catalog", jaxbGenerator.getCatalog(), sequenceAnn );
|
||||||
|
@ -573,7 +595,7 @@ public class XmlAnnotationHelper {
|
||||||
XmlProcessingHelper.applyAttributeIfSpecified( "options", jaxbGenerator.getOptions(), sequenceAnn );
|
XmlProcessingHelper.applyAttributeIfSpecified( "options", jaxbGenerator.getOptions(), sequenceAnn );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void applyTableGenerators(
|
public static void applyTableGenerator(
|
||||||
JaxbTableGeneratorImpl jaxbGenerator,
|
JaxbTableGeneratorImpl jaxbGenerator,
|
||||||
MutableClassDetails classDetails,
|
MutableClassDetails classDetails,
|
||||||
XmlDocumentContext xmlDocumentContext) {
|
XmlDocumentContext xmlDocumentContext) {
|
||||||
|
|
|
@ -43,6 +43,12 @@ public class NoSequenceSupport implements SequenceSupport {
|
||||||
throw new MappingException("dialect does not support sequences");
|
throw new MappingException("dialect does not support sequences");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize, String options)
|
||||||
|
throws MappingException {
|
||||||
|
throw new MappingException( "dialect does not support sequences" );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize) throws MappingException {
|
public String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize) throws MappingException {
|
||||||
throw new MappingException("dialect does not support sequences");
|
throw new MappingException("dialect does not support sequences");
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.dialect.sequence;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.internal.util.StringHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A set of operations providing support for sequences in a
|
* A set of operations providing support for sequences in a
|
||||||
|
@ -112,6 +113,26 @@ public interface SequenceSupport {
|
||||||
return getSequenceNextValString( sequenceName );
|
return getSequenceNextValString( sequenceName );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An optional multi-line form for databases which {@link #supportsPooledSequences()}.
|
||||||
|
*
|
||||||
|
* @param sequenceName The name of the sequence
|
||||||
|
* @param initialValue The initial value to apply to 'create sequence' statement
|
||||||
|
* @param incrementSize The increment value to apply to 'create sequence' statement
|
||||||
|
* @param options A SQL fragment appended to the generated DDL.
|
||||||
|
* @return The sequence creation commands
|
||||||
|
* @throws MappingException If sequences are not supported.
|
||||||
|
*/
|
||||||
|
default String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize, String options)
|
||||||
|
throws MappingException {
|
||||||
|
return new String[] {
|
||||||
|
StringHelper.isNotEmpty( options ) ?
|
||||||
|
getCreateSequenceString( sequenceName, initialValue, incrementSize ) + " " + options :
|
||||||
|
getCreateSequenceString( sequenceName, initialValue, incrementSize ),
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An optional multi-line form for databases which {@link #supportsPooledSequences()}.
|
* An optional multi-line form for databases which {@link #supportsPooledSequences()}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -55,4 +55,9 @@ public interface PersistentIdentifierGenerator extends OptimizableGenerator {
|
||||||
* The key under which to find the {@link org.hibernate.boot.model.naming.ObjectNameNormalizer} in the config param map.
|
* The key under which to find the {@link org.hibernate.boot.model.naming.ObjectNameNormalizer} in the config param map.
|
||||||
*/
|
*/
|
||||||
String IDENTIFIER_NORMALIZER = "identifier_normalizer";
|
String IDENTIFIER_NORMALIZER = "identifier_normalizer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The configuration parameter holding the generator options.
|
||||||
|
*/
|
||||||
|
String OPTIONS = "options";
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ public class SequenceStructure implements DatabaseStructure {
|
||||||
private final int initialValue;
|
private final int initialValue;
|
||||||
private final int incrementSize;
|
private final int incrementSize;
|
||||||
private final Class numberType;
|
private final Class numberType;
|
||||||
|
private final String options;
|
||||||
|
|
||||||
private String sql;
|
private String sql;
|
||||||
private boolean applyIncrementSizeToSourceValues;
|
private boolean applyIncrementSizeToSourceValues;
|
||||||
|
@ -59,6 +60,24 @@ public class SequenceStructure implements DatabaseStructure {
|
||||||
this.initialValue = initialValue;
|
this.initialValue = initialValue;
|
||||||
this.incrementSize = incrementSize;
|
this.incrementSize = incrementSize;
|
||||||
this.numberType = numberType;
|
this.numberType = numberType;
|
||||||
|
this.options = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SequenceStructure(
|
||||||
|
JdbcEnvironment jdbcEnvironment,
|
||||||
|
String contributor,
|
||||||
|
QualifiedName qualifiedSequenceName,
|
||||||
|
int initialValue,
|
||||||
|
int incrementSize,
|
||||||
|
String options,
|
||||||
|
Class numberType) {
|
||||||
|
this.contributor = contributor;
|
||||||
|
this.logicalQualifiedSequenceName = qualifiedSequenceName;
|
||||||
|
|
||||||
|
this.initialValue = initialValue;
|
||||||
|
this.incrementSize = incrementSize;
|
||||||
|
this.options = options;
|
||||||
|
this.numberType = numberType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -188,7 +207,8 @@ public class SequenceStructure implements DatabaseStructure {
|
||||||
namespace.getPhysicalName().getSchema(),
|
namespace.getPhysicalName().getSchema(),
|
||||||
physicalName,
|
physicalName,
|
||||||
initialValue,
|
initialValue,
|
||||||
sourceIncrementSize
|
sourceIncrementSize,
|
||||||
|
options
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,6 +162,7 @@ public class SequenceStyleGenerator
|
||||||
private DatabaseStructure databaseStructure;
|
private DatabaseStructure databaseStructure;
|
||||||
private Optimizer optimizer;
|
private Optimizer optimizer;
|
||||||
private Type identifierType;
|
private Type identifierType;
|
||||||
|
private String options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter for property 'databaseStructure'.
|
* Getter for property 'databaseStructure'.
|
||||||
|
@ -242,6 +243,8 @@ public class SequenceStyleGenerator
|
||||||
getInt( INITIAL_PARAM, parameters, -1 )
|
getInt( INITIAL_PARAM, parameters, -1 )
|
||||||
);
|
);
|
||||||
this.databaseStructure.configure( optimizer );
|
this.databaseStructure.configure( optimizer );
|
||||||
|
|
||||||
|
this.options = parameters.getProperty( OPTIONS );
|
||||||
}
|
}
|
||||||
|
|
||||||
private int adjustIncrementSize(
|
private int adjustIncrementSize(
|
||||||
|
@ -531,6 +534,7 @@ public class SequenceStyleGenerator
|
||||||
sequenceName,
|
sequenceName,
|
||||||
initialValue,
|
initialValue,
|
||||||
incrementSize,
|
incrementSize,
|
||||||
|
params.getProperty( OPTIONS ),
|
||||||
type.getReturnedClass()
|
type.getReturnedClass()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -552,6 +556,7 @@ public class SequenceStyleGenerator
|
||||||
valueColumnName,
|
valueColumnName,
|
||||||
initialValue,
|
initialValue,
|
||||||
incrementSize,
|
incrementSize,
|
||||||
|
params.getProperty( OPTIONS ),
|
||||||
type.getReturnedClass()
|
type.getReturnedClass()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,11 +196,6 @@ public class TableGenerator implements PersistentIdentifierGenerator {
|
||||||
*/
|
*/
|
||||||
public static final int DEF_SEGMENT_LENGTH = 255;
|
public static final int DEF_SEGMENT_LENGTH = 255;
|
||||||
|
|
||||||
/**
|
|
||||||
* Configures the options of the table to use.
|
|
||||||
*/
|
|
||||||
public static final String TABLE_OPTIONS = "options";
|
|
||||||
|
|
||||||
private boolean storeLastUsedValue;
|
private boolean storeLastUsedValue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -365,7 +360,7 @@ public class TableGenerator implements PersistentIdentifierGenerator {
|
||||||
if ( contributor == null ) {
|
if ( contributor == null ) {
|
||||||
contributor = "orm";
|
contributor = "orm";
|
||||||
}
|
}
|
||||||
options = parameters.getProperty( TABLE_OPTIONS );
|
options = parameters.getProperty( OPTIONS );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OptimizerDescriptor determineOptimizationStrategy(Properties parameters, int incrementSize) {
|
private static OptimizerDescriptor determineOptimizationStrategy(Properties parameters, int incrementSize) {
|
||||||
|
|
|
@ -55,6 +55,7 @@ public class TableStructure implements DatabaseStructure {
|
||||||
private final int initialValue;
|
private final int initialValue;
|
||||||
private final int incrementSize;
|
private final int incrementSize;
|
||||||
private final Class numberType;
|
private final Class numberType;
|
||||||
|
private final String options;
|
||||||
|
|
||||||
private String contributor;
|
private String contributor;
|
||||||
|
|
||||||
|
@ -76,12 +77,34 @@ public class TableStructure implements DatabaseStructure {
|
||||||
int initialValue,
|
int initialValue,
|
||||||
int incrementSize,
|
int incrementSize,
|
||||||
Class numberType) {
|
Class numberType) {
|
||||||
|
this(
|
||||||
|
jdbcEnvironment,
|
||||||
|
contributor,
|
||||||
|
qualifiedTableName,
|
||||||
|
valueColumnNameIdentifier,
|
||||||
|
initialValue,
|
||||||
|
incrementSize,
|
||||||
|
null,
|
||||||
|
numberType
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableStructure(
|
||||||
|
JdbcEnvironment jdbcEnvironment,
|
||||||
|
String contributor,
|
||||||
|
QualifiedName qualifiedTableName,
|
||||||
|
Identifier valueColumnNameIdentifier,
|
||||||
|
int initialValue,
|
||||||
|
int incrementSize,
|
||||||
|
String options,
|
||||||
|
Class numberType) {
|
||||||
this.contributor = contributor;
|
this.contributor = contributor;
|
||||||
this.logicalQualifiedTableName = qualifiedTableName;
|
this.logicalQualifiedTableName = qualifiedTableName;
|
||||||
this.logicalValueColumnNameIdentifier = valueColumnNameIdentifier;
|
this.logicalValueColumnNameIdentifier = valueColumnNameIdentifier;
|
||||||
|
|
||||||
this.initialValue = initialValue;
|
this.initialValue = initialValue;
|
||||||
this.incrementSize = incrementSize;
|
this.incrementSize = incrementSize;
|
||||||
|
this.options = options;
|
||||||
this.numberType = numberType;
|
this.numberType = numberType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,6 +315,8 @@ public class TableStructure implements DatabaseStructure {
|
||||||
|
|
||||||
table.addColumn( valueColumn );
|
table.addColumn( valueColumn );
|
||||||
|
|
||||||
|
table.setOptions( options );
|
||||||
|
|
||||||
table.addInitCommand( context -> new InitCommand( "insert into "
|
table.addInitCommand( context -> new InitCommand( "insert into "
|
||||||
+ context.format( physicalTableName ) + " values ( " + initialValue + " )" ) );
|
+ context.format( physicalTableName ) + " values ( " + initialValue + " )" ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,8 @@ public class StandardSequenceExporter implements Exporter<Sequence> {
|
||||||
return dialect.getSequenceSupport().getCreateSequenceStrings(
|
return dialect.getSequenceSupport().getCreateSequenceStrings(
|
||||||
getFormattedSequenceName( sequence.getName(), metadata, context ),
|
getFormattedSequenceName( sequence.getName(), metadata, context ),
|
||||||
sequence.getInitialValue(),
|
sequence.getInitialValue(),
|
||||||
sequence.getIncrementSize()
|
sequence.getIncrementSize(),
|
||||||
|
sequence.getOptions()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
package org.hibernate.orm.test.schemaupdate.sequencegenerator;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.tool.hbm2ddl.SchemaExport;
|
||||||
|
import org.hibernate.tool.schema.TargetType;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.BaseUnitTest;
|
||||||
|
import org.hibernate.testing.util.ServiceRegistryUtil;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
@BaseUnitTest
|
||||||
|
public class SequenceGeneratorOptionsTest {
|
||||||
|
static final String TABLE_NAME = "TEST_ENTITY_TABLE";
|
||||||
|
static final String SEQUENCE_GENERATOR_NAME = "TEST_SEQUENCE_GENERATOR";
|
||||||
|
static final String SEQUENCE_GENERATOR_OPTIONS = "option_0";
|
||||||
|
|
||||||
|
private File output;
|
||||||
|
private StandardServiceRegistry ssr;
|
||||||
|
private MetadataImplementor metadata;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() throws IOException {
|
||||||
|
output = File.createTempFile( "update_script", ".sql" );
|
||||||
|
output.deleteOnExit();
|
||||||
|
ssr = ServiceRegistryUtil.serviceRegistry();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearsDown() {
|
||||||
|
output.delete();
|
||||||
|
StandardServiceRegistryBuilder.destroy( ssr );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSequenceOptionsAreCreated() throws Exception {
|
||||||
|
createSchema( TestEntity.class );
|
||||||
|
assertTrue(
|
||||||
|
tableSequenceStatementContainsOptions( output, SEQUENCE_GENERATOR_NAME, SEQUENCE_GENERATOR_OPTIONS, metadata.getDatabase().getDialect() ),
|
||||||
|
"Sequence " + SEQUENCE_GENERATOR_NAME + " options has not been created "
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testXmlMappingSequenceOptionsAreCreated() throws Exception {
|
||||||
|
createSchema( "org/hibernate/orm/test/schemaupdate/sequencegenerator/TestEntity.xml" );
|
||||||
|
assertTrue(
|
||||||
|
tableSequenceStatementContainsOptions( output, SEQUENCE_GENERATOR_NAME, SEQUENCE_GENERATOR_OPTIONS, metadata.getDatabase().getDialect() ),
|
||||||
|
"Sequence " + SEQUENCE_GENERATOR_NAME + " options has not been created "
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean tableSequenceStatementContainsOptions(
|
||||||
|
File output,
|
||||||
|
String sequenceName,
|
||||||
|
String options,
|
||||||
|
Dialect dialect) throws Exception {
|
||||||
|
String[] fileContent = new String( Files.readAllBytes( output.toPath() ) ).toLowerCase()
|
||||||
|
.split( System.lineSeparator() );
|
||||||
|
for ( int i = 0; i < fileContent.length; i++ ) {
|
||||||
|
String statement = fileContent[i].toUpperCase( Locale.ROOT );
|
||||||
|
if ( dialect.getSequenceSupport().supportsSequences() ) {
|
||||||
|
if ( statement.contains( "CREATE SEQUENCE " + sequenceName.toUpperCase( Locale.ROOT ) ) ) {
|
||||||
|
if ( statement.contains( options.toUpperCase( Locale.ROOT ) ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( statement.contains( "CREATE TABLE " + sequenceName.toUpperCase( Locale.ROOT ) ) ) {
|
||||||
|
if ( statement.contains( options.toUpperCase( Locale.ROOT ) ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSchema(String... xmlMapping) {
|
||||||
|
final MetadataSources metadataSources = new MetadataSources( ssr );
|
||||||
|
|
||||||
|
for ( String xml : xmlMapping ) {
|
||||||
|
metadataSources.addResource( xml );
|
||||||
|
}
|
||||||
|
metadata = (MetadataImplementor) metadataSources.buildMetadata();
|
||||||
|
metadata.orderColumns( false );
|
||||||
|
metadata.validate();
|
||||||
|
new SchemaExport()
|
||||||
|
.setHaltOnError( true )
|
||||||
|
.setOutputFile( output.getAbsolutePath() )
|
||||||
|
.setFormat( false )
|
||||||
|
.createOnly( EnumSet.of( TargetType.SCRIPT ), metadata );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSchema(Class... annotatedClasses) {
|
||||||
|
final MetadataSources metadataSources = new MetadataSources( ssr );
|
||||||
|
|
||||||
|
for ( Class c : annotatedClasses ) {
|
||||||
|
metadataSources.addAnnotatedClass( c );
|
||||||
|
}
|
||||||
|
metadata = (MetadataImplementor) metadataSources.buildMetadata();
|
||||||
|
metadata.orderColumns( false );
|
||||||
|
metadata.validate();
|
||||||
|
new SchemaExport()
|
||||||
|
.setHaltOnError( true )
|
||||||
|
.setOutputFile( output.getAbsolutePath() )
|
||||||
|
.setFormat( false )
|
||||||
|
.createOnly( EnumSet.of( TargetType.SCRIPT ), metadata );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.hibernate.orm.test.schemaupdate.sequencegenerator;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.GeneratedValue;
|
||||||
|
import jakarta.persistence.GenerationType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.SequenceGenerator;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = SequenceGeneratorOptionsTest.TABLE_NAME)
|
||||||
|
public class TestEntity {
|
||||||
|
@Id
|
||||||
|
@SequenceGenerator(name = "seq_gen", sequenceName = SequenceGeneratorOptionsTest.SEQUENCE_GENERATOR_NAME, options = SequenceGeneratorOptionsTest.SEQUENCE_GENERATOR_OPTIONS)
|
||||||
|
@GeneratedValue(generator = "seq_gen", strategy = GenerationType.SEQUENCE)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
~
|
||||||
|
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
-->
|
||||||
|
<entity-mappings xmlns="http://www.hibernate.org/xsd/orm/mapping" version="3.2">
|
||||||
|
<package>org.hibernate.orm.test.schemaupdate.sequencegenerator</package>
|
||||||
|
<entity class="TestEntity" metadata-complete="true">
|
||||||
|
<table name="TEST_ENTITY_TABLE" />
|
||||||
|
<sequence-generator name="seq_gen" sequence-name="TEST_SEQUENCE_GENERATOR" options="option_0"/>
|
||||||
|
<attributes>
|
||||||
|
<id name="id">
|
||||||
|
<generated-value strategy="SEQUENCE" generator="seq_gen"/>
|
||||||
|
</id>
|
||||||
|
<basic name="name"/>
|
||||||
|
</attributes>
|
||||||
|
</entity>
|
||||||
|
</entity-mappings>
|
Loading…
Reference in New Issue