Skip to content

Commit 4183672

Browse files
committed
HHH-9936 - Same Sequence is created and dropped multiple times
1 parent 6974744 commit 4183672

File tree

4 files changed

+70
-49
lines changed

4 files changed

+70
-49
lines changed

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

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@
1010
import java.sql.PreparedStatement;
1111
import java.sql.ResultSet;
1212
import java.sql.SQLException;
13-
import java.util.Collections;
1413
import java.util.Properties;
1514

1615
import org.hibernate.HibernateException;
1716
import org.hibernate.MappingException;
1817
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
1918
import org.hibernate.boot.model.relational.Database;
20-
import org.hibernate.boot.model.relational.NamedAuxiliaryDatabaseObject;
2119
import org.hibernate.boot.model.relational.Namespace;
2220
import org.hibernate.boot.model.relational.QualifiedName;
2321
import org.hibernate.boot.model.relational.QualifiedNameParser;
22+
import org.hibernate.boot.model.relational.Sequence;
2423
import org.hibernate.dialect.Dialect;
2524
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
2625
import org.hibernate.engine.spi.SessionImplementor;
26+
import org.hibernate.internal.log.DeprecationLogger;
2727
import org.hibernate.internal.util.config.ConfigurationHelper;
2828
import org.hibernate.service.ServiceRegistry;
2929
import org.hibernate.type.Type;
@@ -57,12 +57,14 @@ public class SequenceGenerator
5757
/**
5858
* The parameters parameter, appended to the create sequence DDL.
5959
* For example (Oracle): <tt>INCREMENT BY 1 START WITH 1 MAXVALUE 100 NOCACHE</tt>.
60+
*
61+
* @deprecated No longer supported. To specify initial-value or increment use the
62+
* org.hibernate.id.enhanced.SequenceStyleGenerator generator instead.
6063
*/
6164
public static final String PARAMETERS = "parameters";
6265

63-
private QualifiedName qualifiedSequenceName;
66+
private QualifiedName logicalQualifiedSequenceName;
6467
private String sequenceName;
65-
private String parameters;
6668
private Type identifierType;
6769
private String sql;
6870

@@ -81,20 +83,24 @@ public String getSequenceName() {
8183
@Override
8284
@SuppressWarnings("StatementWithEmptyBody")
8385
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
86+
DeprecationLogger.DEPRECATION_LOGGER.deprecatedSequenceGenerator( getClass().getName() );
87+
8488
identifierType = type;
85-
parameters = params.getProperty( PARAMETERS );
8689

87-
final JdbcEnvironment jdbcEnvironment = serviceRegistry.getService( JdbcEnvironment.class );
88-
final Dialect dialect = jdbcEnvironment.getDialect();
8990
final ObjectNameNormalizer normalizer = ( ObjectNameNormalizer ) params.get( IDENTIFIER_NORMALIZER );
90-
qualifiedSequenceName = QualifiedNameParser.INSTANCE.parse(
91+
logicalQualifiedSequenceName = QualifiedNameParser.INSTANCE.parse(
9192
ConfigurationHelper.getString( SEQUENCE, params, "hibernate_sequence" ),
9293
normalizer.normalizeIdentifierQuoting( params.getProperty( CATALOG ) ),
9394
normalizer.normalizeIdentifierQuoting( params.getProperty( SCHEMA ) )
9495
);
95-
sequenceName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( qualifiedSequenceName, dialect );
9696

97-
sql = dialect.getSequenceNextValString( sequenceName );
97+
if ( params.containsKey( PARAMETERS ) ) {
98+
LOG.warn(
99+
"Use of 'parameters' config setting is no longer supported; " +
100+
"to specify initial-value or increment use the " +
101+
"org.hibernate.id.enhanced.SequenceStyleGenerator generator instead."
102+
);
103+
}
98104
}
99105

100106
@Override
@@ -140,11 +146,7 @@ protected IntegralDataTypeHolder buildHolder() {
140146
@Override
141147
@SuppressWarnings( {"deprecation"})
142148
public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
143-
String[] ddl = dialect.getCreateSequenceStrings( sequenceName );
144-
if ( parameters != null ) {
145-
ddl[ddl.length - 1] += ' ' + parameters;
146-
}
147-
return ddl;
149+
return dialect.getCreateSequenceStrings( sequenceName, 1, 1 );
148150
}
149151

150152
@Override
@@ -164,22 +166,29 @@ public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect d
164166

165167
@Override
166168
public void registerExportables(Database database) {
167-
// we cannot register a proper Sequence object here because of the free-form
168-
//'parameters' as opposed to specific initialValue/increment values
169-
170169
final Namespace namespace = database.locateNamespace(
171-
qualifiedSequenceName.getCatalogName(),
172-
qualifiedSequenceName.getSchemaName()
170+
logicalQualifiedSequenceName.getCatalogName(),
171+
logicalQualifiedSequenceName.getSchemaName()
173172
);
173+
Sequence sequence = namespace.locateSequence( logicalQualifiedSequenceName.getObjectName() );
174+
if ( sequence != null ) {
175+
sequence.validate( 1, 1 );
176+
}
177+
else {
178+
sequence = namespace.createSequence(
179+
logicalQualifiedSequenceName.getObjectName(),
180+
1,
181+
1
182+
);
183+
}
184+
185+
final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment();
186+
final Dialect dialect = jdbcEnvironment.getDialect();
174187

175-
database.addAuxiliaryDatabaseObject(
176-
new NamedAuxiliaryDatabaseObject(
177-
qualifiedSequenceName.getObjectName().render(),
178-
namespace,
179-
sqlCreateStrings( database.getDialect() ),
180-
sqlDropStrings( database.getDialect() ),
181-
Collections.<String>emptySet()
182-
)
188+
this.sequenceName = jdbcEnvironment.getQualifiedObjectNameFormatter().format(
189+
sequence.getName(),
190+
dialect
183191
);
192+
this.sql = jdbcEnvironment.getDialect().getSequenceNextValString( sequenceName );
184193
}
185194
}

hibernate-core/src/main/java/org/hibernate/internal/log/DeprecationLogger.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,13 @@ void recognizedObsoleteHibernateNamespace(
159159
void connectionProviderClassDeprecated(
160160
String providerClassName,
161161
String actualProviderClassName);
162+
163+
@LogMessage(level = WARN)
164+
@Message(
165+
id = 90000014,
166+
value = "Found use of deprecated [%s] sequence-based id generator; " +
167+
"use org.hibernate.id.enhanced.SequenceStyleGenerator instead. " +
168+
"See Hibernate Domain Model Mapping Guide for details."
169+
)
170+
void deprecatedSequenceGenerator(String generatorImpl);
162171
}

hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorNoIncrementTest.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.Session;
1717
import org.hibernate.boot.Metadata;
1818
import org.hibernate.boot.MetadataSources;
19+
import org.hibernate.boot.model.naming.Identifier;
1920
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
2021
import org.hibernate.boot.model.relational.SimpleAuxiliaryDatabaseObject;
2122
import org.hibernate.boot.registry.StandardServiceRegistry;
@@ -26,6 +27,7 @@
2627
import org.hibernate.engine.jdbc.spi.JdbcServices;
2728
import org.hibernate.engine.spi.SessionFactoryImplementor;
2829
import org.hibernate.engine.spi.SessionImplementor;
30+
import org.hibernate.id.enhanced.SequenceStyleGenerator;
2931
import org.hibernate.internal.SessionImpl;
3032
import org.hibernate.jdbc.Work;
3133
import org.hibernate.type.StandardBasicTypes;
@@ -55,7 +57,7 @@ public class SequenceHiLoGeneratorNoIncrementTest extends BaseUnitTestCase {
5557

5658
private StandardServiceRegistry serviceRegistry;
5759
private SessionFactoryImplementor sessionFactory;
58-
private SequenceHiLoGenerator generator;
60+
private SequenceStyleGenerator generator;
5961
private SessionImplementor session;
6062

6163
@Before
@@ -70,12 +72,13 @@ public void setUp() throws Exception {
7072
.applySetting( AvailableSettings.HBM2DDL_AUTO, "create-drop" )
7173
.build();
7274

73-
generator = new SequenceHiLoGenerator();
75+
generator = new SequenceStyleGenerator();
7476

7577
// Build the properties used to configure the id generator
7678
Properties properties = new Properties();
77-
properties.setProperty( SequenceGenerator.SEQUENCE, TEST_SEQUENCE );
78-
properties.setProperty( SequenceHiLoGenerator.MAX_LO, "0" ); // JPA allocationSize of 1
79+
properties.setProperty( SequenceStyleGenerator.SEQUENCE_PARAM, TEST_SEQUENCE );
80+
properties.setProperty( SequenceStyleGenerator.OPT_PARAM, "legacy-hilo" );
81+
properties.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "0" ); // JPA allocationSize of 1
7982
properties.put(
8083
PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER,
8184
new ObjectNameNormalizer() {
@@ -88,15 +91,7 @@ protected MetadataBuildingContext getBuildingContext() {
8891
generator.configure( StandardBasicTypes.LONG, properties, serviceRegistry );
8992

9093
final Metadata metadata = new MetadataSources( serviceRegistry ).buildMetadata();
91-
metadata.getDatabase().addAuxiliaryDatabaseObject(
92-
new SimpleAuxiliaryDatabaseObject(
93-
Collections.<String>emptySet(),
94-
null,
95-
null,
96-
generator.sqlCreateStrings( TestingDatabaseInfo.DIALECT ),
97-
generator.sqlDropStrings( TestingDatabaseInfo.DIALECT )
98-
)
99-
);
94+
generator.registerExportables( metadata.getDatabase() );
10095

10196
sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory();
10297
}

hibernate-core/src/test/java/org/hibernate/test/id/sequence/LegacySequenceExportTest.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,16 @@ public void testMultipleUsesOfDefaultSequenceName() {
5757
.buildMetadata();
5858
metadata.validate();
5959

60-
int auxCount = 0;
61-
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
62-
auxCount++;
60+
assertEquals( 0, metadata.getDatabase().getAuxiliaryDatabaseObjects().size() );
61+
62+
int count = 0;
63+
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
64+
for ( Sequence sequence : namespace.getSequences() ) {
65+
count++;
66+
}
6367
}
6468

65-
assertEquals( 1, auxCount );
69+
assertEquals( 1, count );
6670
}
6771

6872
@Test
@@ -74,12 +78,16 @@ public void testMultipleUsesOfExplicitSequenceName() {
7478
.buildMetadata();
7579
metadata.validate();
7680

77-
int auxCount = 0;
78-
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
79-
auxCount++;
81+
assertEquals( 0, metadata.getDatabase().getAuxiliaryDatabaseObjects().size() );
82+
83+
int count = 0;
84+
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
85+
for ( Sequence sequence : namespace.getSequences() ) {
86+
count++;
87+
}
8088
}
8189

82-
assertEquals( 1, auxCount );
90+
assertEquals( 1, count );
8391
}
8492

8593
@Entity( name = "Entity1" )

0 commit comments

Comments
 (0)