Skip to content

Commit 067e892

Browse files
committed
HHH-9936 - Same Sequence is created and dropped multiple times
1 parent 923ecb8 commit 067e892

File tree

6 files changed

+301
-6
lines changed

6 files changed

+301
-6
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/relational/Database.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.ArrayList;
1010
import java.util.Collection;
1111
import java.util.Collections;
12+
import java.util.HashMap;
1213
import java.util.List;
1314
import java.util.Map;
1415
import java.util.TreeMap;
@@ -33,7 +34,7 @@ public class Database {
3334

3435
private final Map<Namespace.Name,Namespace> namespaceMap = new TreeMap<Namespace.Name, Namespace>();
3536

36-
private List<AuxiliaryDatabaseObject> auxiliaryDatabaseObjects;
37+
private Map<String,AuxiliaryDatabaseObject> auxiliaryDatabaseObjects;
3738
private List<InitCommand> initCommands;
3839

3940
public Database(MetadataBuildingOptions buildingOptions) {
@@ -148,15 +149,15 @@ public Namespace adjustDefaultNamespace(String implicitCatalogName, String impli
148149

149150
public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject auxiliaryDatabaseObject) {
150151
if ( auxiliaryDatabaseObjects == null ) {
151-
auxiliaryDatabaseObjects = new ArrayList<AuxiliaryDatabaseObject>();
152+
auxiliaryDatabaseObjects = new HashMap<String,AuxiliaryDatabaseObject>();
152153
}
153-
auxiliaryDatabaseObjects.add( auxiliaryDatabaseObject );
154+
auxiliaryDatabaseObjects.put( auxiliaryDatabaseObject.getExportIdentifier(), auxiliaryDatabaseObject );
154155
}
155156

156157
public Collection<AuxiliaryDatabaseObject> getAuxiliaryDatabaseObjects() {
157158
return auxiliaryDatabaseObjects == null
158159
? Collections.<AuxiliaryDatabaseObject>emptyList()
159-
: auxiliaryDatabaseObjects;
160+
: auxiliaryDatabaseObjects.values();
160161
}
161162

162163
public Collection<InitCommand> getInitCommands() {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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.model.relational;
8+
9+
import java.util.Set;
10+
11+
/**
12+
* Mainly this is used to support legacy sequence exporting.
13+
*
14+
* @author Steve Ebersole
15+
*
16+
* @see org.hibernate.id.SequenceGenerator
17+
*/
18+
public class NamedAuxiliaryDatabaseObject
19+
extends SimpleAuxiliaryDatabaseObject
20+
implements Exportable {
21+
private final String name;
22+
23+
public NamedAuxiliaryDatabaseObject(
24+
String name,
25+
Namespace namespace,
26+
String createString,
27+
String dropString,
28+
Set<String> dialectScopes) {
29+
super( namespace, createString, dropString, dialectScopes );
30+
this.name = name;
31+
}
32+
33+
public NamedAuxiliaryDatabaseObject(
34+
String name,
35+
Namespace namespace,
36+
String[] createStrings,
37+
String[] dropStrings,
38+
Set<String> dialectScopes) {
39+
super( namespace, createStrings, dropStrings, dialectScopes );
40+
this.name = name;
41+
}
42+
43+
@Override
44+
public String getExportIdentifier() {
45+
return name;
46+
}
47+
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import org.hibernate.MappingException;
1818
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
1919
import org.hibernate.boot.model.relational.Database;
20+
import org.hibernate.boot.model.relational.NamedAuxiliaryDatabaseObject;
2021
import org.hibernate.boot.model.relational.Namespace;
2122
import org.hibernate.boot.model.relational.QualifiedName;
2223
import org.hibernate.boot.model.relational.QualifiedNameParser;
23-
import org.hibernate.boot.model.relational.SimpleAuxiliaryDatabaseObject;
2424
import org.hibernate.dialect.Dialect;
2525
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
2626
import org.hibernate.engine.spi.SessionImplementor;
@@ -173,7 +173,8 @@ public void registerExportables(Database database) {
173173
);
174174

175175
database.addAuxiliaryDatabaseObject(
176-
new SimpleAuxiliaryDatabaseObject(
176+
new NamedAuxiliaryDatabaseObject(
177+
qualifiedSequenceName.getObjectName().render(),
177178
namespace,
178179
sqlCreateStrings( database.getDialect() ),
179180
sqlDropStrings( database.getDialect() ),

hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ public void doCreation(Metadata metadata, boolean createNamespaces, Dialect dial
192192
}
193193

194194
if ( auxiliaryDatabaseObject.appliesToDialect( dialect ) ) {
195+
checkExportIdentifier( auxiliaryDatabaseObject, exportIdentifiers );
195196
applySqlStrings(
196197
targets,
197198
dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings(
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
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.test.id.sequence;
8+
9+
import javax.persistence.Entity;
10+
import javax.persistence.GeneratedValue;
11+
import javax.persistence.GenerationType;
12+
import javax.persistence.Id;
13+
import javax.persistence.SequenceGenerator;
14+
import javax.persistence.Table;
15+
16+
import org.hibernate.boot.MetadataSources;
17+
import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
18+
import org.hibernate.boot.model.relational.Namespace;
19+
import org.hibernate.boot.model.relational.Sequence;
20+
import org.hibernate.boot.registry.StandardServiceRegistry;
21+
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
22+
import org.hibernate.boot.spi.MetadataImplementor;
23+
import org.hibernate.cfg.AvailableSettings;
24+
25+
import org.hibernate.testing.TestForIssue;
26+
import org.hibernate.testing.junit4.BaseUnitTestCase;
27+
import org.junit.After;
28+
import org.junit.Before;
29+
import org.junit.Test;
30+
31+
import static org.junit.Assert.assertEquals;
32+
33+
/**
34+
* @author Steve Ebersole
35+
*/
36+
public class LegacySequenceExportTest extends BaseUnitTestCase {
37+
private StandardServiceRegistry ssr;
38+
39+
@Before
40+
public void prepare() {
41+
ssr = new StandardServiceRegistryBuilder()
42+
.applySetting( AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "false" )
43+
.build();
44+
}
45+
46+
@After
47+
public void destroy() {
48+
StandardServiceRegistryBuilder.destroy( ssr );
49+
}
50+
51+
@Test
52+
@TestForIssue( jiraKey = "HHH-9936" )
53+
public void testMultipleUsesOfDefaultSequenceName() {
54+
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
55+
.addAnnotatedClass( Entity1.class )
56+
.addAnnotatedClass( Entity2.class )
57+
.buildMetadata();
58+
metadata.validate();
59+
60+
int auxCount = 0;
61+
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
62+
auxCount++;
63+
}
64+
65+
assertEquals( 1, auxCount );
66+
}
67+
68+
@Test
69+
@TestForIssue( jiraKey = "HHH-9936" )
70+
public void testMultipleUsesOfExplicitSequenceName() {
71+
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
72+
.addAnnotatedClass( Entity3.class )
73+
.addAnnotatedClass( Entity4.class )
74+
.buildMetadata();
75+
metadata.validate();
76+
77+
int auxCount = 0;
78+
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
79+
auxCount++;
80+
}
81+
82+
assertEquals( 1, auxCount );
83+
}
84+
85+
@Entity( name = "Entity1" )
86+
@Table( name = "Entity1" )
87+
public static class Entity1 {
88+
@Id
89+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
90+
public Integer id;
91+
}
92+
93+
@Entity( name = "Entity2" )
94+
@Table( name = "Entity2" )
95+
public static class Entity2 {
96+
@Id
97+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
98+
public Integer id;
99+
}
100+
101+
@Entity( name = "Entity3" )
102+
@Table( name = "Entity3" )
103+
public static class Entity3 {
104+
@Id
105+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
106+
@SequenceGenerator( name = "my_sequence" )
107+
public Integer id;
108+
}
109+
110+
@Entity( name = "Entity4" )
111+
@Table( name = "Entity4" )
112+
public static class Entity4 {
113+
@Id
114+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
115+
@SequenceGenerator( name = "my_sequence" )
116+
public Integer id;
117+
}
118+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
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.test.id.sequence;
8+
9+
import javax.persistence.Entity;
10+
import javax.persistence.GeneratedValue;
11+
import javax.persistence.GenerationType;
12+
import javax.persistence.Id;
13+
import javax.persistence.SequenceGenerator;
14+
import javax.persistence.Table;
15+
16+
import org.hibernate.boot.MetadataSources;
17+
import org.hibernate.boot.model.relational.Namespace;
18+
import org.hibernate.boot.model.relational.Sequence;
19+
import org.hibernate.boot.registry.StandardServiceRegistry;
20+
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
21+
import org.hibernate.boot.spi.MetadataImplementor;
22+
import org.hibernate.cfg.AvailableSettings;
23+
24+
import org.hibernate.testing.TestForIssue;
25+
import org.hibernate.testing.junit4.BaseUnitTestCase;
26+
import org.junit.After;
27+
import org.junit.Before;
28+
import org.junit.Test;
29+
30+
import static org.junit.Assert.assertEquals;
31+
32+
/**
33+
* @author Steve Ebersole
34+
*/
35+
public class SequenceExportTest extends BaseUnitTestCase {
36+
private StandardServiceRegistry ssr;
37+
38+
@Before
39+
public void prepare() {
40+
ssr = new StandardServiceRegistryBuilder()
41+
.applySetting( AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "true" )
42+
.build();
43+
}
44+
45+
@After
46+
public void destroy() {
47+
StandardServiceRegistryBuilder.destroy( ssr );
48+
}
49+
50+
@Test
51+
@TestForIssue( jiraKey = "HHH-9936" )
52+
public void testMultipleUsesOfDefaultSequenceName() {
53+
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
54+
.addAnnotatedClass( Entity1.class )
55+
.addAnnotatedClass( Entity2.class )
56+
.buildMetadata();
57+
metadata.validate();
58+
59+
int namespaceCount = 0;
60+
int sequenceCount = 0;
61+
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
62+
namespaceCount++;
63+
for ( Sequence sequence : namespace.getSequences() ) {
64+
sequenceCount++;
65+
}
66+
}
67+
68+
assertEquals( 1, namespaceCount );
69+
assertEquals( 1, sequenceCount );
70+
}
71+
72+
@Test
73+
@TestForIssue( jiraKey = "HHH-9936" )
74+
public void testMultipleUsesOfExplicitSequenceName() {
75+
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
76+
.addAnnotatedClass( Entity3.class )
77+
.addAnnotatedClass( Entity4.class )
78+
.buildMetadata();
79+
metadata.validate();
80+
81+
int namespaceCount = 0;
82+
int sequenceCount = 0;
83+
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
84+
namespaceCount++;
85+
for ( Sequence sequence : namespace.getSequences() ) {
86+
sequenceCount++;
87+
}
88+
}
89+
90+
assertEquals( 1, namespaceCount );
91+
assertEquals( 1, sequenceCount );
92+
}
93+
94+
@Entity( name = "Entity1" )
95+
@Table( name = "Entity1" )
96+
public static class Entity1 {
97+
@Id
98+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
99+
public Integer id;
100+
}
101+
102+
@Entity( name = "Entity2" )
103+
@Table( name = "Entity2" )
104+
public static class Entity2 {
105+
@Id
106+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
107+
public Integer id;
108+
}
109+
110+
@Entity( name = "Entity3" )
111+
@Table( name = "Entity3" )
112+
public static class Entity3 {
113+
@Id
114+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
115+
@SequenceGenerator( name = "my_sequence" )
116+
public Integer id;
117+
}
118+
119+
@Entity( name = "Entity4" )
120+
@Table( name = "Entity4" )
121+
public static class Entity4 {
122+
@Id
123+
@GeneratedValue( strategy = GenerationType.SEQUENCE )
124+
@SequenceGenerator( name = "my_sequence" )
125+
public Integer id;
126+
}
127+
}

0 commit comments

Comments
 (0)