[hibernate-commits] Hibernate SVN: r18590 - in core/trunk/annotations/src: test/java/org/hibernate/test/annotations/derivedidentities/e1/b and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jan 20 13:36:35 EST 2010


Author: epbernard
Date: 2010-01-20 13:36:34 -0500 (Wed, 20 Jan 2010)
New Revision: 18590

Modified:
   core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/ClassPropertyHolder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/CollectionPropertyHolder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/ComponentPropertyHolder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyHolder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyInferredData.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-4529 Add support for @EmbeddedId

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-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -1256,6 +1256,8 @@
 		if ( !entityBinder.isIgnoreIdAnnotations() &&
 				( property.isAnnotationPresent( Id.class )
 						|| property.isAnnotationPresent( EmbeddedId.class ) ) ) {
+			//Override from @MapsId if needed
+			columns = overrideColumnFromMapsIdProperty( "", columns, propertyHolder, entityBinder, mappings );
 			if ( isIdentifierMapper ) {
 				throw new AnnotationException(
 						"@IdClass class should not have @Id nor @EmbeddedId properties"
@@ -1754,6 +1756,12 @@
 					}
 				}
 
+
+				//Override from @MapsId if needed
+				if ( propertyHolder.isOrWithinEmbeddedId() ) {
+					columns = overrideColumnFromMapsIdProperty( property.getName(), columns, propertyHolder, entityBinder, mappings );
+				}
+
 				PropertyBinder propBinder = new PropertyBinder();
 				propBinder.setName( inferredData.getPropertyName() );
 				propBinder.setReturnedClassName( inferredData.getTypeName() );
@@ -2110,25 +2118,6 @@
 			setupComponentTuplizer( property, componentId );
 		}
 		else {
-			final XClass persistentXClass;
-			try {
-				 persistentXClass = mappings.getReflectionManager()
-						.classForName( persistentClassName, AnnotationBinder.class );
-			}
-			catch ( ClassNotFoundException e ) {
-				throw new AssertionFailure( "Persistence class name cannot be converted into a Class", e);
-			}
-
-			final PropertyData annotatedWithMapsId = mappings.getPropertyAnnotatedWithMapsId( persistentXClass, "" );
-			if ( annotatedWithMapsId != null ) {
-				columns = buildExplicitJoinColumns( propertyHolder, annotatedWithMapsId.getProperty(), annotatedWithMapsId, entityBinder, mappings );
-				if (columns == null) {
-					columns = buildDefaultJoinColumnsForXToOne( propertyHolder, annotatedWithMapsId.getProperty(), annotatedWithMapsId, entityBinder, mappings );
-					throw new UnsupportedOperationException( "Implicit @JoinColumn is not supported on @MapsId properties: "
-							+ annotatedWithMapsId.getDeclaringClass() + " " + annotatedWithMapsId.getPropertyName() );
-				}
-			}
-
 			for (Ejb3Column column : columns) {
 				column.forceNotNull(); //this is an id
 			}
@@ -2170,6 +2159,32 @@
 		}
 	}
 
+	private static Ejb3Column[] overrideColumnFromMapsIdProperty(String propertyPath,
+																 Ejb3Column[] columns,
+																 PropertyHolder propertyHolder,
+																 EntityBinder entityBinder,
+																 ExtendedMappings mappings) {
+		Ejb3Column[] result = columns;
+		final XClass persistentXClass;
+		try {
+			 persistentXClass = mappings.getReflectionManager()
+					.classForName( propertyHolder.getPersistentClass().getClassName(), AnnotationBinder.class );
+		}
+		catch ( ClassNotFoundException e ) {
+			throw new AssertionFailure( "PersistentClass name cannot be converted into a Class", e);
+		}
+		final PropertyData annotatedWithMapsId = mappings.getPropertyAnnotatedWithMapsId( persistentXClass, propertyPath );
+		if ( annotatedWithMapsId != null ) {
+			result = buildExplicitJoinColumns( propertyHolder, annotatedWithMapsId.getProperty(), annotatedWithMapsId, entityBinder, mappings );
+			if (result == null) {
+				result = buildDefaultJoinColumnsForXToOne( propertyHolder, annotatedWithMapsId.getProperty(), annotatedWithMapsId, entityBinder, mappings );
+				throw new UnsupportedOperationException( "Implicit @JoinColumn is not supported on @MapsId properties: "
+						+ annotatedWithMapsId.getDeclaringClass() + " " + annotatedWithMapsId.getPropertyName() );
+			}
+		}
+		return result;
+	}
+
 	private static void setupComponentTuplizer(XProperty property, Component component) {
 		if ( property == null ) return;
 		if ( property.isAnnotationPresent( Tuplizers.class ) ) {

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/ClassPropertyHolder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/ClassPropertyHolder.java	2010-01-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/ClassPropertyHolder.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -195,4 +195,8 @@
 	public KeyValue getIdentifier() {
 		return persistentClass.getIdentifier();
 	}
+
+	public boolean isOrWithinEmbeddedId() {
+		return false;
+	}
 }

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/CollectionPropertyHolder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/CollectionPropertyHolder.java	2010-01-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/CollectionPropertyHolder.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -70,6 +70,10 @@
 		throw new AssertionFailure( "Identifier collection not yet managed" );
 	}
 
+	public boolean isOrWithinEmbeddedId() {
+		return false;
+	}
+
 	public PersistentClass getPersistentClass() {
 		return collection.getOwner();
 	}

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/ComponentPropertyHolder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/ComponentPropertyHolder.java	2010-01-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/ComponentPropertyHolder.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -24,11 +24,14 @@
 package org.hibernate.cfg;
 
 import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 
 import org.hibernate.AnnotationException;
 import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.mapping.Component;
 import org.hibernate.mapping.Join;
 import org.hibernate.mapping.KeyValue;
@@ -45,6 +48,7 @@
 	//TODO introduce a overrideTable() method for columns held by sec table rather than the hack
 	//     joinsPerRealTableName in ClassPropertyHolder
 	private Component component;
+	private boolean isOrWithinEmbeddedId;
 
 	public String getEntityName() {
 		return component.getComponentClassName();
@@ -82,8 +86,14 @@
 			ExtendedMappings mappings
 	) {
 		super( path, parent, inferredData.getPropertyClass(), mappings );
-		setCurrentProperty( inferredData.getProperty() );
+		final XProperty property = inferredData.getProperty();
+		setCurrentProperty( property );
 		this.component = component;
+		this.isOrWithinEmbeddedId =
+				parent.isOrWithinEmbeddedId()
+				|| ( property != null &&
+					( property.isAnnotationPresent( Id.class )
+					|| property.isAnnotationPresent( EmbeddedId.class ) ) );
 	}
 
 	public String getClassName() {
@@ -106,6 +116,10 @@
 		return component.getOwner().getIdentifier();
 	}
 
+	public boolean isOrWithinEmbeddedId() {
+		return isOrWithinEmbeddedId;
+	}
+
 	public PersistentClass getPersistentClass() {
 		return component.getOwner();
 	}

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyHolder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyHolder.java	2010-01-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyHolder.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -53,6 +53,11 @@
 
 	KeyValue getIdentifier();
 
+	/**
+	 * Return true if this component is or is embedded in a @EmbeddedId
+	 */
+	boolean isOrWithinEmbeddedId();
+
 	PersistentClass getPersistentClass();
 
 	boolean isComponent();

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyInferredData.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyInferredData.java	2010-01-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/PropertyInferredData.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -44,6 +44,15 @@
 	private final ReflectionManager reflectionManager;
 	private final XClass declaringClass;
 
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "PropertyInferredData" );
+		sb.append( "{property=" ).append( property );
+		sb.append( ", declaringClass=" ).append( declaringClass );
+		sb.append( '}' );
+		return sb.toString();
+	}
 
 	/**
 	 * Take the annoted element for lazy process

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-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -2,6 +2,7 @@
 
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.MapsId;
 
@@ -13,7 +14,7 @@
 	@EmbeddedId
 	DependentId id;
 
-	// 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-20 16:51:02 UTC (rev 18589)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java	2010-01-20 18:36:34 UTC (rev 18590)
@@ -9,28 +9,28 @@
  */
 public class DerivedIdentitySimpleParentEmbeddedIdDepTest extends TestCase {
 
-//	public void testIt() throws Exception {
-//		assertTrue( SchemaUtil.isColumnPresent( "Dependent", "empPK", getCfg() ) );
-//		assertTrue( ! SchemaUtil.isColumnPresent( "Dependent", "emp_empId", 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( d );
-//		s.flush();
-//		s.clear();
-//		d = (Dependent) s.get( Dependent.class, d.id );
-//		assertEquals( d.id.empPK, d.emp.empId );
-//		s.getTransaction().rollback();
-//		s.close();
-//	}
+	public void testIt() throws Exception {
+		assertTrue( SchemaUtil.isColumnPresent( "Dependent", "FK", 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( d );
+		s.flush();
+		s.clear();
+		d = (Dependent) s.get( Dependent.class, d.id );
+		assertEquals( d.id.empPK, d.emp.empId );
+		s.getTransaction().rollback();
+		s.close();
+	}
 
 	@Override
 	protected Class<?>[] getMappings() {



More information about the hibernate-commits mailing list