HHH-8520 apply global quoting to HBM columns

This commit is contained in:
Brett Meyer 2013-10-01 12:18:22 -04:00
parent f17d8ad7c3
commit 3677045663
11 changed files with 263 additions and 13 deletions

View File

@ -1067,12 +1067,13 @@ public final class HbmBinder {
column.setValue( simpleValue );
column.setTypeIndex( count++ );
bindColumn( columnElement, column, isNullable );
final String columnName = columnElement.attributeValue( "name" );
String columnName = columnElement.attributeValue( "name" );
String logicalColumnName = mappings.getNamingStrategy().logicalColumnName(
columnName, propertyPath
);
column.setName( mappings.getNamingStrategy().columnName(
columnName ) );
columnName = mappings.getNamingStrategy().columnName( columnName );
columnName = quoteIdentifier( columnName, mappings );
column.setName( columnName );
if ( table != null ) {
table.addColumn( column ); // table=null -> an association
// - fill it in later
@ -1122,11 +1123,13 @@ public final class HbmBinder {
if ( column.isUnique() && ManyToOne.class.isInstance( simpleValue ) ) {
( (ManyToOne) simpleValue ).markAsLogicalOneToOne();
}
final String columnName = columnAttribute.getValue();
String columnName = columnAttribute.getValue();
String logicalColumnName = mappings.getNamingStrategy().logicalColumnName(
columnName, propertyPath
);
column.setName( mappings.getNamingStrategy().columnName( columnName ) );
columnName = mappings.getNamingStrategy().columnName( columnName );
columnName = quoteIdentifier( columnName, mappings );
column.setName( columnName );
if ( table != null ) {
table.addColumn( column ); // table=null -> an association - fill
// it in later
@ -1142,7 +1145,9 @@ public final class HbmBinder {
Column column = new Column();
column.setValue( simpleValue );
bindColumn( node, column, isNullable );
column.setName( mappings.getNamingStrategy().propertyToColumnName( propertyPath ) );
String columnName = mappings.getNamingStrategy().propertyToColumnName( propertyPath );
columnName = quoteIdentifier( columnName, mappings );
column.setName( columnName );
String logicalName = mappings.getNamingStrategy().logicalColumnName( null, propertyPath );
mappings.addColumnBinding( logicalName, column, table );
/* TODO: joinKeyColumnName & foreignKeyColumnName should be called either here or at a
@ -3196,6 +3201,11 @@ public final class HbmBinder {
recognizeEntities( mappings, element, handler );
}
}
private static String quoteIdentifier(String identifier, Mappings mappings) {
return mappings.getObjectNameNormalizer().isUseQuotedIdentifiersGlobally()
? StringHelper.quote( identifier ) : identifier;
}
private static interface EntityElementHandler {
public void handleEntity(String entityName, String className, Mappings mappings);

View File

@ -0,0 +1,58 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* JBoss, Home of Professional Open Source
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.test.quote;
import java.util.List;
/**
* @author Brett Meyer
*/
public class AssociatedDataPoint {
private long id;
private AssociatedDataPoint manyToOne;
private List<AssociatedDataPoint> manyToMany;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public AssociatedDataPoint getManyToOne() {
return manyToOne;
}
public void setManyToOne(AssociatedDataPoint manyToOne) {
this.manyToOne = manyToOne;
}
public List<AssociatedDataPoint> getManyToMany() {
return manyToMany;
}
public void setManyToMany(List<AssociatedDataPoint> manyToMany) {
this.manyToMany = manyToMany;
}
}

View File

@ -0,0 +1,65 @@
<?xml version="1.0"?>
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ Copyright
(c) 2013, Red Hat Middleware LLC or third-party contributors as ~ indicated
by the @author tags or express copyright attribution ~ statements applied
by the authors. All third-party contributions are ~ distributed under license
by Red Hat Middleware LLC. ~ ~ This copyrighted material is made available
to anyone wishing to use, modify, ~ copy, or redistribute it subject to the
terms and conditions of the GNU ~ Lesser General Public License, as published
by the Free Software Foundation. ~ ~ This program is distributed in the hope
that it will be useful, ~ but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY ~ or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License ~ for more details. ~ ~ You should have
received a copy of the GNU Lesser General Public License ~ along with this
distribution; if not, write to: ~ Free Software Foundation, Inc. ~ 51 Franklin
Street, Fifth Floor ~ Boston, MA 02110-1301 USA ~ -->
<!DOCTYPE hibernate-mapping
SYSTEM
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.hibernate.test.quote">
<typedef name="enumType" class="org.hibernate.type.EnumType">
<param name="enumClass">org.hibernate.test.quote.DataPoint$DataPointEnum</param>
</typedef>
<class name="DataPoint">
<id column="ID" name="id" type="long">
<generator class="native" />
</id>
<property name="fooProp" type="string" />
<property name="fooEnum">
<type name="enumType"/>
</property>
<set name="fooEnumList">
<key/>
<element type="enumType"/>
</set>
<set name="oneToMany" inverse="true">
<key column="o2mid"/>
<one-to-many class="AssociatedDataPoint" />
</set>
<set name="manyToMany" table="m2mjointable" inverse="false">
<key/>
<many-to-many class="AssociatedDataPoint"/>
</set>
</class>
<class name="AssociatedDataPoint">
<id column="ID" name="id" type="long">
<generator class="native" />
</id>
<many-to-one name="manyToOne" column="o2mid" class="DataPoint"/>
<set name="manyToMany" table="m2mjointable" inverse="true">
<key/>
<many-to-many class="DataPoint"/>
</set>
</class>
</hibernate-mapping>

View File

@ -0,0 +1,92 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* JBoss, Home of Professional Open Source
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.test.quote;
import java.util.List;
/**
* @author Brett Meyer
*/
public class DataPoint {
private long id;
private String fooProp;
private DataPointEnum fooEnum;
private List<DataPointEnum> fooEnumList;
private List<AssociatedDataPoint> oneToMany;
private List<AssociatedDataPoint> manyToMany;
public static enum DataPointEnum {
FOO1, FOO2, FOO3;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFooProp() {
return fooProp;
}
public void setFooProp(String fooProp) {
this.fooProp = fooProp;
}
public DataPointEnum getFooEnum() {
return fooEnum;
}
public void setFooEnum(DataPointEnum fooEnum) {
this.fooEnum = fooEnum;
}
public List<DataPointEnum> getFooEnumList() {
return fooEnumList;
}
public void setFooEnumList(List<DataPointEnum> fooEnumList) {
this.fooEnumList = fooEnumList;
}
public List<AssociatedDataPoint> getOneToMany() {
return oneToMany;
}
public void setOneToMany(List<AssociatedDataPoint> oneToMany) {
this.oneToMany = oneToMany;
}
public List<AssociatedDataPoint> getManyToMany() {
return manyToMany;
}
public void setManyToMany(List<AssociatedDataPoint> manyToMany) {
this.manyToMany = manyToMany;
}
}

View File

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;

View File

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;

View File

@ -1,4 +1,4 @@
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

View File

@ -21,9 +21,10 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Iterator;
@ -32,6 +33,8 @@ import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Table;
import org.hibernate.mapping.UniqueKey;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
@ -75,6 +78,23 @@ public class QuoteGlobalTest extends BaseCoreFunctionalTestCase {
assertEquals( "User_Role", configuration().getCollectionMapping( role ).getCollectionTable().getName() );
s.close();
}
@Test
@TestForIssue(jiraKey = "HHH-8520")
public void testHbmQuoting() {
doTestHbmQuoting( DataPoint.class );
doTestHbmQuoting( AssociatedDataPoint.class );
}
private void doTestHbmQuoting(Class clazz) {
Table table = configuration().getClassMapping( clazz.getName() ).getTable();
assertTrue( table.isQuoted() );
Iterator itr = table.getColumnIterator();
while(itr.hasNext()) {
Column column = (Column) itr.next();
assertTrue( column.isQuoted() );
}
}
@Override
protected void configure(Configuration cfg) {
@ -92,4 +112,9 @@ public class QuoteGlobalTest extends BaseCoreFunctionalTestCase {
House.class
};
}
@Override
protected String[] getMappings() {
return new String[] { "quote/DataPoint.hbm.xml" };
}
}

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

View File

@ -1,5 +1,5 @@
//$Id$
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;

View File

@ -1,5 +1,5 @@
//$Id$
package org.hibernate.test.annotations.quote;
package org.hibernate.test.quote;
import java.io.Serializable;
import java.util.HashSet;