[hibernate-commits] Hibernate SVN: r18655 - 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 13:46:52 EST 2010


Author: epbernard
Date: 2010-01-27 13:46:51 -0500 (Wed, 27 Jan 2010)
New Revision: 18655

Added:
   core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java
Modified:
   core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java
Log:
HHH-4849 honor default join column names for @MapsId properties

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -1758,6 +1758,12 @@
 
 				propertyBinder.setLazy( lazy );
 				propertyBinder.setColumns( columns );
+				if (isOverridden) {
+					final PropertyData mapsIdProperty = BinderHelper.getPropertyAnnotatedWithMapsId(
+							isId, propertyHolder, property.getName(), mappings
+					);
+					propertyBinder.setReferencedEntityName( mapsIdProperty.getClassOrElementName() );
+				}
 
 				propertyBinder.makePropertyValueAndBind();
 

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -365,6 +365,7 @@
 		caches.clear();
 		try {
 			inSecondPass = true;
+			processSecondPassesOfType( PkDrivenByDefaultMapsIdSecondPass.class );
 			processSecondPassesOfType( SetSimpleValueTypeSecondPass.class );
 			processSecondPassesOfType( CopyIdentifierComponentSecondPass.class );
 			processFkSecondPassInOrder();

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -189,9 +189,9 @@
 		if ( annotatedWithMapsId != null ) {
 			result = buildExplicitJoinColumns( annotatedWithMapsId.getProperty(), annotatedWithMapsId );
 			if (result == null) {
-				//result = buildDefaultJoinColumnsForXToOne( annotatedWithMapsId.getProperty(), annotatedWithMapsId);
-				throw new UnsupportedOperationException( "Implicit @JoinColumn is not supported on @MapsId properties: "
-						+ annotatedWithMapsId.getDeclaringClass() + " " + annotatedWithMapsId.getPropertyName() );
+				result = buildDefaultJoinColumnsForXToOne( annotatedWithMapsId.getProperty(), annotatedWithMapsId);
+//				throw new UnsupportedOperationException( "Implicit @JoinColumn is not supported on @MapsId properties: "
+//						+ annotatedWithMapsId.getDeclaringClass() + " " + annotatedWithMapsId.getPropertyName() );
 			}
 		}
 		return result;

Added: core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java	                        (rev 0)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -0,0 +1,38 @@
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.cfg.annotations.TableBinder;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PkDrivenByDefaultMapsIdSecondPass implements SecondPass {
+	private final String referencedEntityName;
+	private final Ejb3JoinColumn[] columns;
+	private final SimpleValue value;
+
+	public PkDrivenByDefaultMapsIdSecondPass(String referencedEntityName, Ejb3JoinColumn[] columns, SimpleValue value) {
+		this.referencedEntityName = referencedEntityName;
+		this.columns = columns;
+		this.value = value;
+	}
+
+	public void doSecondPass(Map persistentClasses) throws MappingException {
+		PersistentClass referencedEntity = (PersistentClass) persistentClasses.get( referencedEntityName );
+		if ( referencedEntity == null ) {
+			throw new AnnotationException(
+					"Unknown entity name: " + referencedEntityName
+			);
+		};
+		TableBinder.linkJoinColumnWithValueOverridingNameIfImplicit(
+				referencedEntity,
+				referencedEntity.getKey().getColumnIterator(),
+				columns,
+				value);
+	}
+}

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -78,7 +78,12 @@
 	private boolean embedded;
 	private EntityBinder entityBinder;
 	private boolean isXToMany;
+	private String referencedEntityName;
 
+	public void setReferencedEntityName(String referencedEntityName) {
+		this.referencedEntityName = referencedEntityName;
+	}
+
 	public void setEmbedded(boolean embedded) {
 		this.embedded = embedded;
 	}
@@ -179,6 +184,7 @@
 		simpleValueBinder.setPersistentClassName( containerClassName );
 		simpleValueBinder.setType( property, returnedClass );
 		simpleValueBinder.setMappings( mappings );
+		simpleValueBinder.setReferencedEntityName( referencedEntityName );
 		SimpleValue propertyValue = simpleValueBinder.make();
 		setValue( propertyValue );
 		return makeProperty();

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 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -45,8 +45,10 @@
 import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.cfg.BinderHelper;
 import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
 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;
@@ -77,7 +79,12 @@
 	private boolean isVersion;
 	//is a Map key
 	private boolean key;
+	private String referencedEntityName;
 
+	public void setReferencedEntityName(String referencedEntityName) {
+		this.referencedEntityName = referencedEntityName;
+	}
+
 	public boolean isVersion() {
 		return isVersion;
 	}
@@ -307,9 +314,16 @@
 	}
 
 	public void linkWithValue() {
-		for ( Ejb3Column column : columns) {
-			column.linkWithValue( simpleValue );
+		if ( columns[0].isNameDeferred() && ! mappings.isInSecondPass() && referencedEntityName != null) {
+			mappings.addSecondPass(
+					new PkDrivenByDefaultMapsIdSecondPass( referencedEntityName, ( Ejb3JoinColumn[]) columns, simpleValue)
+			);
 		}
+		else {
+			for ( Ejb3Column column : columns) {
+				column.linkWithValue( simpleValue );
+			}
+		}
 	}
 
 	public void fillSimpleValue() {

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -474,7 +474,7 @@
 		}
 	}
 
-	private static void linkJoinColumnWithValueOverridingNameIfImplicit(
+	public static void linkJoinColumnWithValueOverridingNameIfImplicit(
 			PersistentClass referencedEntity, Iterator columnIterator, Ejb3JoinColumn[] columns, SimpleValue value
 	) {	
 		for (Ejb3JoinColumn joinCol : columns) {

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -14,7 +14,7 @@
 	@EmbeddedId
 	DependentId id;
 
-	@JoinColumn(name="FK") // id attribute mapped by join column default
+	//@JoinColumn(name="FK") // id attribute mapped by join column default
 	@MapsId("empPK") // maps empPK attribute of embedded id
 	@ManyToOne
 	Employee emp;

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java	2010-01-27 18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java	2010-01-27 18:46:51 UTC (rev 18655)
@@ -11,19 +11,19 @@
 		DerivedIdentitySimpleParentEmbeddedIdDepTest extends TestCase {
 
 	public void testManyToOne() throws Exception {
-		assertTrue( SchemaUtil.isColumnPresent( "Dependent", "FK", getCfg() ) );
+		assertTrue( SchemaUtil.isColumnPresent( "Dependent", "emp_empId", getCfg() ) );
 		assertTrue( ! SchemaUtil.isColumnPresent( "Dependent", "empPK", getCfg() ) );
 		Employee e = new Employee();
 		e.empId = 1;
 		e.empName = "Emmanuel";
 		Session s = openSession(  );
 		s.getTransaction().begin();
-		s.persist( e );
+
 		Dependent d = new Dependent();
 		d.emp = e;
 		d.id = new DependentId();
 		d.id.name = "Doggy";
-		//d.id.empPK = e.empId; //FIXME not needed when foreign is enabled
+		s.persist( e );
 		s.persist( d );
 		s.flush();
 		s.clear();



More information about the hibernate-commits mailing list