Skip to content

HHH-14835 : More changes to support SchemaMigrator/SchemaValidator using Hibernate Reactive #4235

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,26 @@
*/
package org.hibernate.dialect;

import org.hibernate.boot.Metadata;
import org.hibernate.boot.model.relational.QualifiedSequenceName;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.SQLServer2012LimitHandler;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.tool.schema.internal.StandardSequenceExporter;
import org.hibernate.tool.schema.spi.Exporter;

/**
* Microsoft SQL Server 2012 Dialect
*
* @author Brett Meyer
*/
public class SQLServer2012Dialect extends SQLServer2008Dialect {
private final Exporter<Sequence> sequenceExporter;

public SQLServer2012Dialect() {
sequenceExporter = new SqlServerSequenceExporter( this );
}

@Override
public boolean supportsSequences() {
Expand All @@ -26,6 +37,11 @@ public boolean supportsPooledSequences() {
return true;
}

@Override
public Exporter<Sequence> getSequenceExporter() {
return sequenceExporter;
}

@Override
public String getCreateSequenceString(String sequenceName) {
return "create sequence " + sequenceName;
Expand Down Expand Up @@ -94,4 +110,22 @@ public boolean supportsLimitOffset() {
protected LimitHandler getDefaultLimitHandler() {
return new SQLServer2012LimitHandler();
}

private class SqlServerSequenceExporter extends StandardSequenceExporter {

public SqlServerSequenceExporter(Dialect dialect) {
super( dialect );
}

@Override
protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata) {
if ( name.getCatalogName() != null ) {
// SQL Server does not allow the catalog in the sequence name.
// See https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15&viewFallbackFrom=sql-server-ver12
// Keeping the catalog in the name does not break on ORM, but it fails using Vert.X for Reactive.
name = new QualifiedSequenceName( null, name.getSchemaName(), name.getObjectName() );
}
return super.getFormattedSequenceName( name, metadata );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@
*/
package org.hibernate.dialect;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.engine.jdbc.env.spi.IdentifierCaseStrategy;
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
import org.hibernate.type.descriptor.sql.BlobTypeDescriptor;
import org.hibernate.type.descriptor.sql.ClobTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
Expand Down Expand Up @@ -48,4 +54,21 @@ public String getNullColumnString() {
public String getCurrentSchemaCommand() {
return "select db_name()";
}

@Override
public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData dbMetaData)
throws SQLException {
if ( dbMetaData == null ) {
builder.setUnquotedCaseStrategy( IdentifierCaseStrategy.MIXED );
builder.setQuotedCaseStrategy( IdentifierCaseStrategy.MIXED );
}

return super.buildIdentifierHelper( builder, dbMetaData );
}

@Override
public NameQualifierSupport getNameQualifierSupport() {
return NameQualifierSupport.CATALOG;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,9 @@ public TableInformation getTable(Identifier catalog, Identifier schema, Identifi
}

private Identifier getCurrentSchema(JdbcEnvironment jdbcEnvironment) {
if ( jdbcEnvironment.getNameQualifierSupport() == NameQualifierSupport.CATALOG ) {
return null;
}
if ( currentSchema != null ) {
return currentSchema;
}
Expand All @@ -428,6 +431,9 @@ private Identifier getCurrentSchema(JdbcEnvironment jdbcEnvironment) {
}

private Identifier getCurrentCatalog(JdbcEnvironment jdbcEnvironment) {
if ( jdbcEnvironment.getNameQualifierSupport() == NameQualifierSupport.SCHEMA ) {
return null;
}
if ( currentCatalog != null ) {
return currentCatalog;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.hibernate.tool.schema.internal;

import org.hibernate.boot.Metadata;
import org.hibernate.boot.model.relational.QualifiedSequenceName;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
Expand All @@ -24,25 +25,25 @@ public StandardSequenceExporter(Dialect dialect) {

@Override
public String[] getSqlCreateStrings(Sequence sequence, Metadata metadata) {
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
return dialect.getCreateSequenceStrings(
jdbcEnvironment.getQualifiedObjectNameFormatter().format(
sequence.getName(),
jdbcEnvironment.getDialect()
),
getFormattedSequenceName( sequence.getName(), metadata ),
sequence.getInitialValue(),
sequence.getIncrementSize()
);
}

@Override
public String[] getSqlDropStrings(Sequence sequence, Metadata metadata) {
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
return dialect.getDropSequenceStrings(
jdbcEnvironment.getQualifiedObjectNameFormatter().format(
sequence.getName(),
jdbcEnvironment.getDialect()
)
getFormattedSequenceName( sequence.getName(), metadata )
);
}

protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata) {
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
return jdbcEnvironment.getQualifiedObjectNameFormatter().format(
name,
jdbcEnvironment.getDialect()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* 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.schemaupdate;

import java.util.EnumSet;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.cfg.Environment;
import org.hibernate.dialect.SQLServer2012Dialect;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;

import org.hibernate.testing.RequiresDialect;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.CustomRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

/**
* @author Andrea Boriero
*/
@TestForIssue(jiraKey = "HHH-14835")
@RunWith(CustomRunner.class)
@RequiresDialect(SQLServer2012Dialect.class)
public class SchemaExportSqlServerWithSequenceDefaultSchemaCatalog {
protected ServiceRegistry serviceRegistry;
protected MetadataImplementor metadata;

@Test
public void shouldCreateIndex() {
SchemaExport schemaExport = new SchemaExport();
schemaExport.create( EnumSet.of( TargetType.DATABASE, TargetType.STDOUT ), metadata );
assertThat( schemaExport.getExceptions().size(), is( 0 ) );
}

@Before
public void setUp() {
serviceRegistry = new StandardServiceRegistryBuilder()
.applySetting( Environment.DEFAULT_SCHEMA, "dbo" )
.applySetting( Environment.DEFAULT_CATALOG, "hibernate_orm_test" )
.build();
metadata = (MetadataImplementor) new MetadataSources( serviceRegistry )
.addAnnotatedClass( MyEntity.class )
.buildMetadata();

System.out.println( "********* Starting SchemaExport for START-UP *************************" );
new SchemaExport().create( EnumSet.of( TargetType.DATABASE, TargetType.STDOUT ), metadata );
System.out.println( "********* Completed SchemaExport for START-UP *************************" );
}


@After
public void tearDown() {
System.out.println( "********* Starting SchemaExport (drop) for TEAR-DOWN *************************" );
new SchemaExport().drop( EnumSet.of( TargetType.DATABASE, TargetType.STDOUT ), metadata );
System.out.println( "********* Completed SchemaExport (drop) for TEAR-DOWN *************************" );

StandardServiceRegistryBuilder.destroy( serviceRegistry );
serviceRegistry = null;
}


@Entity
@Table(name = "MyEntity")
public static class MyEntity {
private int id;

@Id
@GeneratedValue
public int getId() {
return this.id;
}

public void setId(final int id) {
this.id = id;
}
}
}