Author: epbernard
Date: 2010-01-27 18:29:24 -0500 (Wed, 27 Jan 2010)
New Revision: 18659
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/CopyIdentifierComponentSecondPass.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/Dependent.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/DerivedIdentityIdClassParentEmbeddedIdDepTest.java
Log:
HHH-4849 honor default join column names for @MapsId propertie including on ids with
multiple columns
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/CopyIdentifierComponentSecondPass.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/CopyIdentifierComponentSecondPass.java 2010-01-27
23:06:38 UTC (rev 18658)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/CopyIdentifierComponentSecondPass.java 2010-01-27
23:29:24 UTC (rev 18659)
@@ -12,7 +12,6 @@
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Value;
/**
* @author Emmanuel Bernard
@@ -46,12 +45,13 @@
Component referencedComponent = (Component) referencedPersistentClass.getIdentifier();
Iterator<Property> properties = referencedComponent.getPropertyIterator();
+
//prepare column name structure
boolean isExplicitReference = true;
Map<String, Ejb3JoinColumn> columnByReferencedName = new HashMap<String,
Ejb3JoinColumn>(joinColumns.length);
for (Ejb3JoinColumn joinColumn : joinColumns) {
final String referencedColumnName = joinColumn.getReferencedColumn();
- if ( BinderHelper.isDefault( referencedColumnName ) ) {
+ if ( referencedColumnName == null || BinderHelper.isDefault( referencedColumnName ) )
{
break;
}
columnByReferencedName.put( referencedColumnName, joinColumn );
@@ -87,29 +87,40 @@
value.setTypeName( referencedValue.getTypeName() );
value.setTypeParameters( referencedValue.getTypeParameters() );
final Iterator<Column> columns = referencedValue.getColumnIterator();
- //FIXME take care of Formula
- while ( columns.hasNext() ) {
- Column column = columns.next();
- final Ejb3JoinColumn joinColumn;
- String logicalColumnName = null;
- if ( isExplicitReference ) {
- final String columnName = column.getName();
- logicalColumnName = mappings.getLogicalColumnName( columnName,
referencedPersistentClass.getTable() );
- joinColumn = columnByReferencedName.get( logicalColumnName );
+
+ if ( joinColumns[0].isNameDeferred() ) {
+ joinColumns[0].copyReferencedStructureAndCreateDefaultJoinColumns(
+ referencedPersistentClass,
+ columns,
+ value);
+ }
+ else {
+ //FIXME take care of Formula
+ while ( columns.hasNext() ) {
+ Column column = columns.next();
+ final Ejb3JoinColumn joinColumn;
+ String logicalColumnName = null;
+ if ( isExplicitReference ) {
+ final String columnName = column.getName();
+ logicalColumnName = mappings.getLogicalColumnName( columnName,
referencedPersistentClass.getTable() );
+ joinColumn = columnByReferencedName.get( logicalColumnName );
+ }
+ else {
+ joinColumn = columnByReferencedName.get( "" + index );
+ index++;
+ }
+ if ( joinColumn == null && ! joinColumns[0].isNameDeferred() ) {
+ throw new AnnotationException(
+ isExplicitReference ?
+ "Unable to find column reference in the @MapsId mapping: " +
logicalColumnName :
+ "Implicit column reference in the @MapsId mapping fails, try to use
explicit referenceColumnNames: " + referencedEntityName
+ );
+ }
+ final String columnName = joinColumn == null || joinColumn.isNameDeferred() ?
"tata_" + column.getName() : joinColumn
+ .getName();
+ value.addColumn( new Column( columnName ) );
+ column.setValue( value );
}
- else {
- joinColumn = columnByReferencedName.get( "" + index );
- index++;
- }
- if (joinColumn == null) {
- throw new AnnotationException(
- isExplicitReference ?
- "Unable to find column reference in the @MapsId mapping: " +
logicalColumnName :
- "Implicit column reference in the @MapsId mapping fails, try to use
explicit referenceColumnNames: " + referencedEntityName
- );
- }
- value.addColumn( new Column( joinColumn.getName() ) );
- column.setValue( value );
}
component.addProperty( property );
}
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java 2010-01-27
23:06:38 UTC (rev 18658)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java 2010-01-27
23:29:24 UTC (rev 18659)
@@ -31,6 +31,7 @@
import javax.persistence.PrimaryKeyJoinColumn;
import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
import org.hibernate.MappingException;
import org.hibernate.util.StringHelper;
import org.hibernate.annotations.JoinColumnOrFormula;
@@ -386,6 +387,22 @@
}
}
+
+
+ public void copyReferencedStructureAndCreateDefaultJoinColumns(
+ PersistentClass referencedEntity, Iterator columnIterator, SimpleValue value
+ ) {
+ if ( !isNameDeferred() ) {
+ throw new AssertionFailure( "Building implicit column but the column is not
implicit" );
+ }
+ while ( columnIterator.hasNext() ) {
+ Column synthCol = (Column) columnIterator.next();
+ this.linkValueUsingDefaultColumnNaming( synthCol, referencedEntity, value );
+ }
+ //reset for the future
+ setMappingColumn( null );
+ }
+
public void linkValueUsingDefaultColumnNaming(
Column referencedColumn, PersistentClass referencedEntity, SimpleValue value
) {
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2010-01-27
23:06:38 UTC (rev 18658)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2010-01-27
23:29:24 UTC (rev 18659)
@@ -27,7 +27,6 @@
import java.sql.Types;
import java.util.Calendar;
import java.util.Date;
-import java.util.Map;
import java.util.Properties;
import javax.persistence.Enumerated;
import javax.persistence.Lob;
@@ -36,6 +35,9 @@
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import org.hibernate.AnnotationException;
import org.hibernate.AssertionFailure;
import org.hibernate.Hibernate;
@@ -49,7 +51,6 @@
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.cfg.PkDrivenByDefaultMapsIdSecondPass;
-import org.hibernate.cfg.SecondPass;
import org.hibernate.cfg.SetSimpleValueTypeSecondPass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
@@ -59,8 +60,6 @@
import org.hibernate.type.SerializableToBlobType;
import org.hibernate.type.WrappedMaterializedBlobType;
import org.hibernate.util.StringHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* @author Emmanuel Bernard
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/Dependent.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/Dependent.java 2010-01-27
23:06:38 UTC (rev 18658)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/Dependent.java 2010-01-27
23:29:24 UTC (rev 18659)
@@ -16,10 +16,10 @@
DependentId id;
@MapsId("empPK")
- @JoinColumns({
- @JoinColumn(name = "FK1", referencedColumnName = "firstName"),
- @JoinColumn(name = "FK2", referencedColumnName = "lastName")
- })
+// @JoinColumns({
+// @JoinColumn(name = "FK1", referencedColumnName = "firstName"),
+// @JoinColumn(name = "FK2", referencedColumnName = "lastName")
+// })
@ManyToOne
Employee emp;
}
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/DerivedIdentityIdClassParentEmbeddedIdDepTest.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/DerivedIdentityIdClassParentEmbeddedIdDepTest.java 2010-01-27
23:06:38 UTC (rev 18658)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e2/b/DerivedIdentityIdClassParentEmbeddedIdDepTest.java 2010-01-27
23:29:24 UTC (rev 18659)
@@ -10,8 +10,8 @@
public class DerivedIdentityIdClassParentEmbeddedIdDepTest extends TestCase {
public void testManyToOne() throws Exception {
- assertTrue( SchemaUtil.isColumnPresent( "Dependent", "FK1",
getCfg() ) );
- assertTrue( SchemaUtil.isColumnPresent( "Dependent", "FK2",
getCfg() ) );
+ assertTrue( SchemaUtil.isColumnPresent( "Dependent",
"emp_firstName", getCfg() ) );
+ assertTrue( SchemaUtil.isColumnPresent( "Dependent",
"emp_lastName", getCfg() ) );
assertTrue( SchemaUtil.isColumnPresent( "Dependent", "name",
getCfg() ) );
assertTrue( ! SchemaUtil.isColumnPresent( "Dependent", "firstName",
getCfg() ) );
assertTrue( ! SchemaUtil.isColumnPresent( "Dependent", "lastName",
getCfg() ) );
@@ -42,8 +42,9 @@
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
- Dependent.class,
- Employee.class
+ Employee.class,
+ Dependent.class
+
};
}
}