[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