boolean forceTableUse = ConfigurationHelper.getBoolean( FORCE_TBL_PARAM, params, false ); final QualifiedName sequenceName = determineSequenceName( params, dialect, jdbcEnvironment, serviceRegistry ); final int initialValue = determineInitialValue( params ); int incrementSize = determineIncrementSize( params ); if ( isPhysicalSequence( jdbcEnvironment, forceTableUse ) ) { String databaseSequenceName = sequenceName.getObjectName().getText(); Long databaseIncrementValue = getSequenceIncrementValue( jdbcEnvironment, databaseSequenceName ); final String optimizationStrategy = determineOptimizationStrategy( params, incrementSize ); incrementSize = determineAdjustedIncrementSize( optimizationStrategy, incrementSize ); this.databaseStructure = buildDatabaseStructure( type, params,
@Override public boolean supportsBulkInsertionIdentifierGeneration() { // it does, as long as // 1) there is no (non-noop) optimizer in use // 2) the underlying structure is a sequence return NoopOptimizer.class.isInstance( getOptimizer() ) && getDatabaseStructure().isPhysicalSequence(); }
@SuppressWarnings("WeakerAccess") protected DatabaseStructure buildTableStructure( Type type, Properties params, JdbcEnvironment jdbcEnvironment, QualifiedName sequenceName, int initialValue, int incrementSize) { final Identifier valueColumnName = determineValueColumnName( params, jdbcEnvironment ); return new TableStructure( jdbcEnvironment, sequenceName, valueColumnName, initialValue, incrementSize, type.getReturnedClass() ); }
@Before public void setUp() throws Exception { serviceRegistry = new StandardServiceRegistryBuilder() .enableAutoClose() .applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" ) .build(); generator = new SequenceStyleGenerator(); // Build the properties used to configure the id generator Properties properties = new Properties(); properties.setProperty( SequenceStyleGenerator.SEQUENCE_PARAM, TEST_SEQUENCE ); properties.setProperty( SequenceStyleGenerator.OPT_PARAM, "legacy-hilo" ); properties.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "0" ); // JPA allocationSize of 1 properties.put( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, new ObjectNameNormalizer() { @Override protected MetadataBuildingContext getBuildingContext() { return new MetadataBuildingContextTestingImpl( serviceRegistry ); } } ); generator.configure( StandardBasicTypes.LONG, properties, serviceRegistry ); final Metadata metadata = new MetadataSources( serviceRegistry ).buildMetadata(); generator.registerExportables( metadata.getDatabase() ); sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory(); sequenceValueExtractor = new SequenceValueExtractor( sessionFactory.getDialect(), TEST_SEQUENCE ); }
boolean forceTableUse = ConfigurationHelper.getBoolean( FORCE_TBL_PARAM, params, false ); final String sequenceName = determineSequenceName( params, dialect ); final int initialValue = determineInitialValue( params ); int incrementSize = determineIncrementSize( params ); final String optimizationStrategy = determineOptimizationStrategy( params, incrementSize ); incrementSize = determineAdjustedIncrementSize( optimizationStrategy, incrementSize ); this.databaseStructure = buildDatabaseStructure( type, params,
@Override public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect dialect) { return dialect.getSelectSequenceNextValString( getDatabaseStructure().getName() ); }
@Override protected QualifiedName determineSequenceName(Properties params, Dialect dialect, JdbcEnvironment jdbcEnv, ServiceRegistry serviceRegistry) { String tableName = ConfigurationHelper.getString(CONFIG_TARGET_TABLE, params); if (null == tableName) { return super.determineSequenceName(params, dialect, jdbcEnv, serviceRegistry); } else { Identifier catalog = jdbcEnv.getIdentifierHelper() .toIdentifier(ConfigurationHelper.getString(CATALOG, params)); Identifier schema = jdbcEnv.getIdentifierHelper() .toIdentifier(ConfigurationHelper.getString(SCHEMA, params)); return new QualifiedNameParser.NameParts(catalog, schema, jdbcEnv.getIdentifierHelper().toIdentifier(tableName.toUpperCase() + DEF_SEQUENCE_SUFFIX)); } }
private void assertOptimizer( SessionFactoryImplementor sessionFactory, Class<?> entityClass, Class<? extends Optimizer> expectedOptimizerClass) { assertTrue( SequenceStyleGenerator.class.isInstance( sessionFactory.getMetamodel() .entityPersister( entityClass ) .getIdentifierGenerator() ) ); SequenceStyleGenerator generator = (SequenceStyleGenerator) sessionFactory.getMetamodel() .entityPersister( entityClass ) .getIdentifierGenerator(); assertTrue( expectedOptimizerClass.isInstance( generator.getOptimizer() ) ); }
@Override public void configure(final Type type, final Properties params, final ServiceRegistry serviceRegistry) { // Augment the property set with the global configuration params.setProperty(CONFIG_PREFER_SEQUENCE_PER_ENTITY, Boolean.TRUE.toString()); params.setProperty(INCREMENT_PARAM, "1000"); params.setProperty(FORCE_TBL_PARAM, "true"); super.configure(type, params, serviceRegistry); }
boolean forceTableUse = ConfigurationHelper.getBoolean( FORCE_TBL_PARAM, params, false ); final String sequenceName = determineSequenceName( params, dialect ); final int initialValue = determineInitialValue( params ); int incrementSize = determineIncrementSize( params ); final String optimizationStrategy = determineOptimizationStrategy( params, incrementSize ); incrementSize = determineAdjustedIncrementSize( optimizationStrategy, incrementSize ); this.databaseStructure = buildDatabaseStructure( type, params,
@Test public void testAutoEntity() { final EntityPersister persister = sessionFactory().getEntityPersister( AutoEntity.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, seqGenerator.getDatabaseStructure().getName() ); assertEquals( SequenceStyleGenerator.DEFAULT_INITIAL_VALUE, seqGenerator.getDatabaseStructure().getInitialValue() ); assertEquals( SequenceStyleGenerator.DEFAULT_INCREMENT_SIZE, seqGenerator.getDatabaseStructure().getIncrementSize() ); }
@Override protected QualifiedName determineSequenceName(Properties params, Dialect dialect, JdbcEnvironment jdbcEnv, ServiceRegistry serviceRegistry) { String tableName = ConfigurationHelper.getString(CONFIG_TARGET_TABLE, params); if (null == tableName) { return super.determineSequenceName(params, dialect, jdbcEnv, serviceRegistry); } else { Identifier catalog = jdbcEnv.getIdentifierHelper() .toIdentifier(ConfigurationHelper.getString(CATALOG, params)); Identifier schema = jdbcEnv.getIdentifierHelper() .toIdentifier(ConfigurationHelper.getString(SCHEMA, params)); return new QualifiedNameParser.NameParts(catalog, schema, jdbcEnv.getIdentifierHelper().toIdentifier(tableName.toUpperCase() + DEF_SEQUENCE_SUFFIX)); } }
/** * If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we assign one * based on the table name. */ public void configure(Type type, Properties params, Dialect dialect) { if (Strings.isEmpty(params.getProperty(SEQUENCE_PARAM))) { String tableName = params.getProperty(PersistentIdentifierGenerator.TABLE); String pk = params.getProperty(PersistentIdentifierGenerator.PK); if (null != tableName) { String seqName = Strings.replace(sequencePattern, "{table}", tableName); seqName = Strings.replace(seqName, "{pk}", pk); if (seqName.length() > MaxLength) { logger.error("{}'s length >=30, wouldn't be supported in some db!", seqName); } String entityName = params.getProperty(IdentifierGenerator.ENTITY_NAME); if (null != entityName && null != namingStrategy) { String schema = namingStrategy.getSchema(entityName); if (null != schema) seqName = schema + "." + seqName; } params.setProperty(SEQUENCE_PARAM, seqName); } } super.configure(type, params, dialect); }
boolean forceTableUse = ConfigurationHelper.getBoolean( FORCE_TBL_PARAM, params, false ); final QualifiedName sequenceName = determineSequenceName( params, dialect, jdbcEnvironment, serviceRegistry ); final int initialValue = determineInitialValue( params ); int incrementSize = determineIncrementSize( params ); if ( isPhysicalSequence( jdbcEnvironment, forceTableUse ) ) { String databaseSequenceName = sequenceName.getObjectName().getText(); Long databaseIncrementValue = getSequenceIncrementValue( jdbcEnvironment, databaseSequenceName ); final String optimizationStrategy = determineOptimizationStrategy( params, incrementSize ); incrementSize = determineAdjustedIncrementSize( optimizationStrategy, incrementSize ); this.databaseStructure = buildDatabaseStructure( javaTypeDescriptor, params,
@Test public void testMinimalSequenceEntity() { final EntityPersister persister = sessionFactory().getEntityPersister( MinimalSequenceEntity.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; assertEquals( MinimalSequenceEntity.SEQ_NAME, seqGenerator.getDatabaseStructure().getName() ); // 1 is the annotation default assertEquals( 1, seqGenerator.getDatabaseStructure().getInitialValue() ); // 50 is the annotation default assertEquals( 50, seqGenerator.getDatabaseStructure().getIncrementSize() ); assertFalse( NoopOptimizer.class.isInstance( seqGenerator.getOptimizer() ) ); }
@Test public void baseline() { final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build(); final Metadata bootModel = new MetadataSources( ssr ) .addAnnotatedClass( ExplicitGeneratorEntity.class ) .buildMetadata(); final PersistentClass entityMapping = bootModel.getEntityBinding( ExplicitGeneratorEntity.class.getName() ); final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator( bootModel.getIdentifierGeneratorFactory(), ssr.getService( JdbcEnvironment.class ).getDialect(), null, null, (RootClass) entityMapping ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, generator ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "my_real_db_sequence" ) ); // all the JPA defaults since they were not defined assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 100 ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getIncrementSize(), is( 500 ) ); }
@Override protected QualifiedName determineSequenceName(final Properties params, final Dialect dialect, final JdbcEnvironment jdbcEnv, final ServiceRegistry serviceRegistry) { // Make sure sequence are lower case and corresponds to table name params.put(SEQUENCE_PARAM, StringHelper.unquote(params.getProperty("identity_tables")) + ConfigurationHelper.getString(CONFIG_SEQUENCE_PER_ENTITY_SUFFIX, params, DEF_SEQUENCE_SUFFIX)); return super.determineSequenceName(params, dialect, jdbcEnv, serviceRegistry); } }
@SuppressWarnings("WeakerAccess") protected DatabaseStructure buildTableStructure( JavaTypeDescriptor javaTypeDescriptor, Properties params, JdbcEnvironment jdbcEnvironment, QualifiedName sequenceName, int initialValue, int incrementSize) { final Identifier valueColumnName = determineValueColumnName( params, jdbcEnvironment ); return new TableStructure( jdbcEnvironment, sequenceName, valueColumnName, initialValue, incrementSize, javaTypeDescriptor.getJavaType() ); }
@Test public void testCompleteSequenceEntity() { final EntityPersister persister = sessionFactory().getEntityPersister( CompleteSequenceEntity.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; assertEquals( 1000, seqGenerator.getDatabaseStructure().getInitialValue() ); assertEquals( 52, seqGenerator.getDatabaseStructure().getIncrementSize() ); assertFalse( NoopOptimizer.class.isInstance( seqGenerator.getOptimizer() ) ); }
@Test public void testImplicitSequenceGeneratorGeneratorName() { final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build(); final Metadata bootModel = new MetadataSources( ssr ) .addAnnotatedClass( ImplicitSequenceGeneratorEntity.class ) .buildMetadata(); final PersistentClass entityMapping = bootModel.getEntityBinding( ImplicitSequenceGeneratorEntity.class.getName() ); final IdentifierGenerator generator = entityMapping.getIdentifier().createIdentifierGenerator( bootModel.getIdentifierGeneratorFactory(), ssr.getService( JdbcEnvironment.class ).getDialect(), null, null, (RootClass) entityMapping ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, generator ); // PREFER_GENERATOR_NAME_AS_DEFAULT_SEQUENCE_NAME == true (the default) indicates that the generator-name // should be used as the default instead. assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "my_db_sequence" ) ); // the JPA defaults since they were not defined assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 1 ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getIncrementSize(), is( 50 ) ); }