[hibernate-commits] Hibernate SVN: r18659 - in core/trunk/annotations/src: main/java/org/hibernate/cfg/annotations and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jan 27 18:29:25 EST 2010


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
+
 		};
 	}
 }



More information about the hibernate-commits mailing list