mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-28 06:49:09 +00:00
HHH-9936 - Same Sequence is created and dropped multiple times
This commit is contained in:
parent
923ecb8e2c
commit
067e892767
@ -9,6 +9,7 @@
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
@ -33,7 +34,7 @@ public class Database {
|
|||||||
|
|
||||||
private final Map<Namespace.Name,Namespace> namespaceMap = new TreeMap<Namespace.Name, Namespace>();
|
private final Map<Namespace.Name,Namespace> namespaceMap = new TreeMap<Namespace.Name, Namespace>();
|
||||||
|
|
||||||
private List<AuxiliaryDatabaseObject> auxiliaryDatabaseObjects;
|
private Map<String,AuxiliaryDatabaseObject> auxiliaryDatabaseObjects;
|
||||||
private List<InitCommand> initCommands;
|
private List<InitCommand> initCommands;
|
||||||
|
|
||||||
public Database(MetadataBuildingOptions buildingOptions) {
|
public Database(MetadataBuildingOptions buildingOptions) {
|
||||||
@ -148,15 +149,15 @@ public Namespace adjustDefaultNamespace(String implicitCatalogName, String impli
|
|||||||
|
|
||||||
public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject auxiliaryDatabaseObject) {
|
public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject auxiliaryDatabaseObject) {
|
||||||
if ( auxiliaryDatabaseObjects == null ) {
|
if ( auxiliaryDatabaseObjects == null ) {
|
||||||
auxiliaryDatabaseObjects = new ArrayList<AuxiliaryDatabaseObject>();
|
auxiliaryDatabaseObjects = new HashMap<String,AuxiliaryDatabaseObject>();
|
||||||
}
|
}
|
||||||
auxiliaryDatabaseObjects.add( auxiliaryDatabaseObject );
|
auxiliaryDatabaseObjects.put( auxiliaryDatabaseObject.getExportIdentifier(), auxiliaryDatabaseObject );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<AuxiliaryDatabaseObject> getAuxiliaryDatabaseObjects() {
|
public Collection<AuxiliaryDatabaseObject> getAuxiliaryDatabaseObjects() {
|
||||||
return auxiliaryDatabaseObjects == null
|
return auxiliaryDatabaseObjects == null
|
||||||
? Collections.<AuxiliaryDatabaseObject>emptyList()
|
? Collections.<AuxiliaryDatabaseObject>emptyList()
|
||||||
: auxiliaryDatabaseObjects;
|
: auxiliaryDatabaseObjects.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<InitCommand> getInitCommands() {
|
public Collection<InitCommand> getInitCommands() {
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.boot.model.relational;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mainly this is used to support legacy sequence exporting.
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*
|
||||||
|
* @see org.hibernate.id.SequenceGenerator
|
||||||
|
*/
|
||||||
|
public class NamedAuxiliaryDatabaseObject
|
||||||
|
extends SimpleAuxiliaryDatabaseObject
|
||||||
|
implements Exportable {
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public NamedAuxiliaryDatabaseObject(
|
||||||
|
String name,
|
||||||
|
Namespace namespace,
|
||||||
|
String createString,
|
||||||
|
String dropString,
|
||||||
|
Set<String> dialectScopes) {
|
||||||
|
super( namespace, createString, dropString, dialectScopes );
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamedAuxiliaryDatabaseObject(
|
||||||
|
String name,
|
||||||
|
Namespace namespace,
|
||||||
|
String[] createStrings,
|
||||||
|
String[] dropStrings,
|
||||||
|
Set<String> dialectScopes) {
|
||||||
|
super( namespace, createStrings, dropStrings, dialectScopes );
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getExportIdentifier() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
@ -17,10 +17,10 @@
|
|||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
|
import org.hibernate.boot.model.naming.ObjectNameNormalizer;
|
||||||
import org.hibernate.boot.model.relational.Database;
|
import org.hibernate.boot.model.relational.Database;
|
||||||
|
import org.hibernate.boot.model.relational.NamedAuxiliaryDatabaseObject;
|
||||||
import org.hibernate.boot.model.relational.Namespace;
|
import org.hibernate.boot.model.relational.Namespace;
|
||||||
import org.hibernate.boot.model.relational.QualifiedName;
|
import org.hibernate.boot.model.relational.QualifiedName;
|
||||||
import org.hibernate.boot.model.relational.QualifiedNameParser;
|
import org.hibernate.boot.model.relational.QualifiedNameParser;
|
||||||
import org.hibernate.boot.model.relational.SimpleAuxiliaryDatabaseObject;
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
|
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
@ -173,7 +173,8 @@ public void registerExportables(Database database) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
database.addAuxiliaryDatabaseObject(
|
database.addAuxiliaryDatabaseObject(
|
||||||
new SimpleAuxiliaryDatabaseObject(
|
new NamedAuxiliaryDatabaseObject(
|
||||||
|
qualifiedSequenceName.getObjectName().render(),
|
||||||
namespace,
|
namespace,
|
||||||
sqlCreateStrings( database.getDialect() ),
|
sqlCreateStrings( database.getDialect() ),
|
||||||
sqlDropStrings( database.getDialect() ),
|
sqlDropStrings( database.getDialect() ),
|
||||||
|
@ -192,6 +192,7 @@ public void doCreation(Metadata metadata, boolean createNamespaces, Dialect dial
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( auxiliaryDatabaseObject.appliesToDialect( dialect ) ) {
|
if ( auxiliaryDatabaseObject.appliesToDialect( dialect ) ) {
|
||||||
|
checkExportIdentifier( auxiliaryDatabaseObject, exportIdentifiers );
|
||||||
applySqlStrings(
|
applySqlStrings(
|
||||||
targets,
|
targets,
|
||||||
dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings(
|
dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings(
|
||||||
|
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.id.sequence;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.SequenceGenerator;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
|
||||||
|
import org.hibernate.boot.model.relational.Namespace;
|
||||||
|
import org.hibernate.boot.model.relational.Sequence;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class LegacySequenceExportTest extends BaseUnitTestCase {
|
||||||
|
private StandardServiceRegistry ssr;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void prepare() {
|
||||||
|
ssr = new StandardServiceRegistryBuilder()
|
||||||
|
.applySetting( AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "false" )
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void destroy() {
|
||||||
|
StandardServiceRegistryBuilder.destroy( ssr );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-9936" )
|
||||||
|
public void testMultipleUsesOfDefaultSequenceName() {
|
||||||
|
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
|
||||||
|
.addAnnotatedClass( Entity1.class )
|
||||||
|
.addAnnotatedClass( Entity2.class )
|
||||||
|
.buildMetadata();
|
||||||
|
metadata.validate();
|
||||||
|
|
||||||
|
int auxCount = 0;
|
||||||
|
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
|
||||||
|
auxCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals( 1, auxCount );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-9936" )
|
||||||
|
public void testMultipleUsesOfExplicitSequenceName() {
|
||||||
|
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
|
||||||
|
.addAnnotatedClass( Entity3.class )
|
||||||
|
.addAnnotatedClass( Entity4.class )
|
||||||
|
.buildMetadata();
|
||||||
|
metadata.validate();
|
||||||
|
|
||||||
|
int auxCount = 0;
|
||||||
|
for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : metadata.getDatabase().getAuxiliaryDatabaseObjects() ) {
|
||||||
|
auxCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals( 1, auxCount );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity1" )
|
||||||
|
@Table( name = "Entity1" )
|
||||||
|
public static class Entity1 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity2" )
|
||||||
|
@Table( name = "Entity2" )
|
||||||
|
public static class Entity2 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity3" )
|
||||||
|
@Table( name = "Entity3" )
|
||||||
|
public static class Entity3 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
@SequenceGenerator( name = "my_sequence" )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity4" )
|
||||||
|
@Table( name = "Entity4" )
|
||||||
|
public static class Entity4 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
@SequenceGenerator( name = "my_sequence" )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.id.sequence;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.SequenceGenerator;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.model.relational.Namespace;
|
||||||
|
import org.hibernate.boot.model.relational.Sequence;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class SequenceExportTest extends BaseUnitTestCase {
|
||||||
|
private StandardServiceRegistry ssr;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void prepare() {
|
||||||
|
ssr = new StandardServiceRegistryBuilder()
|
||||||
|
.applySetting( AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "true" )
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void destroy() {
|
||||||
|
StandardServiceRegistryBuilder.destroy( ssr );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-9936" )
|
||||||
|
public void testMultipleUsesOfDefaultSequenceName() {
|
||||||
|
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
|
||||||
|
.addAnnotatedClass( Entity1.class )
|
||||||
|
.addAnnotatedClass( Entity2.class )
|
||||||
|
.buildMetadata();
|
||||||
|
metadata.validate();
|
||||||
|
|
||||||
|
int namespaceCount = 0;
|
||||||
|
int sequenceCount = 0;
|
||||||
|
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
|
||||||
|
namespaceCount++;
|
||||||
|
for ( Sequence sequence : namespace.getSequences() ) {
|
||||||
|
sequenceCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals( 1, namespaceCount );
|
||||||
|
assertEquals( 1, sequenceCount );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-9936" )
|
||||||
|
public void testMultipleUsesOfExplicitSequenceName() {
|
||||||
|
final MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
|
||||||
|
.addAnnotatedClass( Entity3.class )
|
||||||
|
.addAnnotatedClass( Entity4.class )
|
||||||
|
.buildMetadata();
|
||||||
|
metadata.validate();
|
||||||
|
|
||||||
|
int namespaceCount = 0;
|
||||||
|
int sequenceCount = 0;
|
||||||
|
for ( Namespace namespace : metadata.getDatabase().getNamespaces() ) {
|
||||||
|
namespaceCount++;
|
||||||
|
for ( Sequence sequence : namespace.getSequences() ) {
|
||||||
|
sequenceCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals( 1, namespaceCount );
|
||||||
|
assertEquals( 1, sequenceCount );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity1" )
|
||||||
|
@Table( name = "Entity1" )
|
||||||
|
public static class Entity1 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity2" )
|
||||||
|
@Table( name = "Entity2" )
|
||||||
|
public static class Entity2 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity3" )
|
||||||
|
@Table( name = "Entity3" )
|
||||||
|
public static class Entity3 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
@SequenceGenerator( name = "my_sequence" )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "Entity4" )
|
||||||
|
@Table( name = "Entity4" )
|
||||||
|
public static class Entity4 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue( strategy = GenerationType.SEQUENCE )
|
||||||
|
@SequenceGenerator( name = "my_sequence" )
|
||||||
|
public Integer id;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user