/*
* 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.quote;
import java.util.Iterator;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.boot.MetadataSources;
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.dialect.Dialect;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* @author Steve Ebersole
*/
public class ColumnDefinitionQuotingTest extends BaseUnitTestCase {
@Test
@TestForIssue( jiraKey = "HHH-9491" )
public void testExplicitQuoting() {
withStandardServiceRegistry(
false,
false,
new TestWork() {
@Override
public void doTestWork(StandardServiceRegistry ssr) {
MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( E1.class )
.buildMetadata();
metadata.validate();
PersistentClass entityBinding = metadata.getEntityBinding( E1.class.getName() );
org.hibernate.mapping.Column idColumn = extractColumn( entityBinding.getIdentifier().getColumnIterator() );
assertTrue( isQuoted( idColumn.getSqlType(), ssr ) );
org.hibernate.mapping.Column otherColumn = extractColumn( entityBinding.getProperty( "other" ).getColumnIterator() );
assertTrue( isQuoted( otherColumn.getSqlType(), ssr ) );
}
}
);
}
private org.hibernate.mapping.Column extractColumn(Iterator columnIterator) {
return (org.hibernate.mapping.Column) columnIterator.next();
}
private boolean isQuoted(String sqlType, StandardServiceRegistry ssr) {
final Dialect dialect = ssr.getService( JdbcEnvironment.class ).getDialect();
return sqlType.charAt( 0 ) == dialect.openQuote()
&& sqlType.charAt( sqlType.length()-1 ) == dialect.closeQuote();
}
@Test
@TestForIssue( jiraKey = "HHH-9491" )
public void testGlobalQuotingOptIn() {
withStandardServiceRegistry(
true,
true,
new TestWork() {
@Override
public void doTestWork(StandardServiceRegistry ssr) {
MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( E2.class )
.buildMetadata();
metadata.validate();
PersistentClass entityBinding = metadata.getEntityBinding( E2.class.getName() );
org.hibernate.mapping.Column idColumn = extractColumn( entityBinding.getIdentifier().getColumnIterator() );
assertTrue( isQuoted( idColumn.getSqlType(), ssr ) );
org.hibernate.mapping.Column otherColumn = extractColumn( entityBinding.getProperty( "other" ).getColumnIterator() );
assertTrue( isQuoted( otherColumn.getSqlType(), ssr ) );
}
}
);
}
@Test
@TestForIssue( jiraKey = "HHH-9491" )
public void testGlobalQuotingOptOut() {
withStandardServiceRegistry(
true,
false,
new TestWork() {
@Override
public void doTestWork(StandardServiceRegistry ssr) {
MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( ssr )
.addAnnotatedClass( E2.class )
.buildMetadata();
metadata.validate();
PersistentClass entityBinding = metadata.getEntityBinding( E2.class.getName() );
org.hibernate.mapping.Column idColumn = extractColumn( entityBinding.getIdentifier().getColumnIterator() );
assertTrue( !isQuoted( idColumn.getSqlType(), ssr ) );
org.hibernate.mapping.Column otherColumn = extractColumn( entityBinding.getProperty( "other" ).getColumnIterator() );
assertTrue( !isQuoted( otherColumn.getSqlType(), ssr ) );
}
}
);
}
interface TestWork {
void doTestWork(StandardServiceRegistry ssr);
}
void withStandardServiceRegistry(boolean globalQuoting, boolean skipColumnDefinitions, TestWork work) {
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
.applySetting( AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS, globalQuoting )
.applySetting( AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS_SKIP_COLUMN_DEFINITIONS, skipColumnDefinitions )
.build();
try {
work.doTestWork( ssr );
}
finally {
StandardServiceRegistryBuilder.destroy( ssr );
}
}
@Entity
public static class E1 {
@Id
@Column( columnDefinition = "`explicitly quoted`" )
private Integer id;
@ManyToOne
@JoinColumn( columnDefinition = "`explicitly quoted`" )
private E1 other;
}
@Entity
public static class E2 {
@Id
@Column( columnDefinition = "not explicitly quoted" )
private Integer id;
@ManyToOne
@JoinColumn( columnDefinition = "not explicitly quoted" )
private E2 other;
}
}