-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
HHH-12302: Schema creation uses non-unicode string types on SAP HANA
- add Parameter hibernate.dialect.hana.use_unicode_string_types that allows switching the database string types to unicode (nvarchar, nchar, nclob)
- Loading branch information
1 parent
7a29fca
commit ffb2ac0
Showing
2 changed files
with
240 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
187 changes: 187 additions & 0 deletions
187
...est/java/org/hibernate/test/schemaupdate/HANASchemaMigrationTargetScriptCreationTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
/* | ||
* 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 javax.persistence.Entity; | ||
import javax.persistence.Id; | ||
import javax.persistence.Lob; | ||
import javax.persistence.Table; | ||
import java.io.File; | ||
import java.io.IOException; | ||
import java.nio.file.Files; | ||
import java.util.EnumSet; | ||
import java.util.regex.Matcher; | ||
import java.util.regex.Pattern; | ||
|
||
import org.hibernate.boot.MetadataSources; | ||
import org.hibernate.boot.spi.MetadataImplementor; | ||
import org.hibernate.cfg.Configuration; | ||
import org.hibernate.cfg.Environment; | ||
import org.hibernate.dialect.AbstractHANADialect; | ||
import org.hibernate.service.ServiceRegistry; | ||
import org.hibernate.tool.hbm2ddl.SchemaExport; | ||
import org.hibernate.tool.schema.TargetType; | ||
|
||
import org.junit.After; | ||
import org.junit.Test; | ||
import org.hibernate.testing.RequiresDialect; | ||
import org.hibernate.testing.ServiceRegistryBuilder; | ||
import org.hibernate.testing.TestForIssue; | ||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; | ||
|
||
import static org.hamcrest.core.Is.is; | ||
import static org.junit.Assert.assertThat; | ||
import static org.junit.Assert.fail; | ||
|
||
/** | ||
* @author Jonathan Bregler | ||
*/ | ||
@RequiresDialect(value = AbstractHANADialect.class) | ||
public class HANASchemaMigrationTargetScriptCreationTest extends BaseCoreFunctionalTestCase { | ||
|
||
private File output; | ||
|
||
@Override | ||
protected Class<?>[] getAnnotatedClasses() { | ||
return new Class[]{ TestEntity.class }; | ||
} | ||
|
||
@Override | ||
protected boolean createSchema() { | ||
return false; | ||
} | ||
|
||
@Override | ||
protected void configure(Configuration configuration) { | ||
try { | ||
output = File.createTempFile( "update_script", ".sql" ); | ||
} | ||
catch (IOException e) { | ||
fail( e.getMessage() ); | ||
} | ||
output.deleteOnExit(); | ||
configuration.setProperty( Environment.HBM2DDL_SCRIPTS_ACTION, "create" ); | ||
configuration.setProperty( Environment.HBM2DDL_SCRIPTS_CREATE_TARGET, output.getAbsolutePath() ); | ||
} | ||
|
||
@After | ||
public void tearDown() { | ||
ServiceRegistry serviceRegistry = ServiceRegistryBuilder.buildServiceRegistry( Environment.getProperties() ); | ||
try { | ||
MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( serviceRegistry ) | ||
.addAnnotatedClass( TestEntity.class ) | ||
.buildMetadata(); | ||
metadata.validate(); | ||
|
||
new SchemaExport().drop( EnumSet.of( TargetType.DATABASE, TargetType.STDOUT ), metadata ); | ||
} | ||
finally { | ||
ServiceRegistryBuilder.destroy( serviceRegistry ); | ||
} | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12302") | ||
public void testTargetScriptIsCreatedStringTypeDefault() throws Exception { | ||
this.rebuildSessionFactory(); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field varchar.+, b boolean.+, c varchar.+, lob clob.+" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12302") | ||
public void testTargetScriptIsCreatedStringTypeNVarchar() throws Exception { | ||
this.rebuildSessionFactory( config -> { | ||
config.setProperty( "hibernate.dialect.hana.use_unicode_string_types", "true" ); | ||
} ); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field nvarchar.+, b boolean.+, c nvarchar.+, lob nclob" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12302") | ||
public void testTargetScriptIsCreatedStringTypeVarchar() throws Exception { | ||
this.rebuildSessionFactory( config -> { | ||
config.setProperty( "hibernate.dialect.hana.use_nvarchar_string_type", "false" ); | ||
} ); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field varchar.+, b boolean.+, c varchar.+, lob clob" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12132") | ||
public void testTargetScriptIsCreatedBooleanTypeDefault() throws Exception { | ||
this.rebuildSessionFactory(); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field varchar.+, b boolean.+, c varchar.+, lob clob" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12132") | ||
public void testTargetScriptIsCreatedBooleanTypeLegacy() throws Exception { | ||
this.rebuildSessionFactory( config -> { | ||
config.setProperty( "hibernate.dialect.hana.use_legacy_boolean_type", "true" ); | ||
} ); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field varchar.+, b tinyint.+, c varchar.+, lob clob" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Test | ||
@TestForIssue(jiraKey = "HHH-12132") | ||
public void testTargetScriptIsCreatedBooleanType() throws Exception { | ||
this.rebuildSessionFactory( config -> { | ||
config.setProperty( "hibernate.dialect.hana.use_legacy_boolean_type", "false" ); | ||
} ); | ||
String fileContent = new String( Files.readAllBytes( output.toPath() ) ); | ||
Pattern fileContentPattern = Pattern.compile( "create( (column|row))? table test_entity \\(field varchar.+, b boolean.+, c varchar.+, lob clob" ); | ||
Matcher fileContentMatcher = fileContentPattern.matcher( fileContent.toLowerCase() ); | ||
assertThat( | ||
"Script file : " + fileContent.toLowerCase(), | ||
fileContentMatcher.find(), | ||
is( true ) ); | ||
} | ||
|
||
@Entity | ||
@Table(name = "test_entity") | ||
public static class TestEntity { | ||
|
||
@Id | ||
private String field; | ||
|
||
private char c; | ||
|
||
@Lob | ||
private String lob; | ||
|
||
private boolean b; | ||
} | ||
} |