[hibernate-commits] Hibernate SVN: r18566 - in core/trunk/entitymanager: src/main/java/org/hibernate/ejb/metamodel and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Jan 15 13:47:54 EST 2010


Author: epbernard
Date: 2010-01-15 13:47:54 -0500 (Fri, 15 Jan 2010)
New Revision: 18566

Added:
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Being.java
Modified:
   core/trunk/entitymanager/pom.xml
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Child.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Parent.java
Log:
HHH-4805 take better care of generics.

Modified: core/trunk/entitymanager/pom.xml
===================================================================
--- core/trunk/entitymanager/pom.xml	2010-01-15 17:58:18 UTC (rev 18565)
+++ core/trunk/entitymanager/pom.xml	2010-01-15 18:47:54 UTC (rev 18566)
@@ -60,7 +60,7 @@
             -->
             <groupId>${project.groupId}</groupId>
             <artifactId>hibernate-jpamodelgen</artifactId>
-            <version>1.0.0-Beta-2</version>
+            <version>1.0.0-SNAPSHOT</version>
             <scope>test</scope>
             <exclusions>
                 <exclusion>

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java	2010-01-15 17:58:18 UTC (rev 18565)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java	2010-01-15 18:47:54 UTC (rev 18566)
@@ -27,6 +27,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.TypeVariable;
 import java.util.Iterator;
 import javax.persistence.ManyToMany;
 import javax.persistence.OneToOne;
@@ -733,12 +734,12 @@
 
 			ParameterizedType signatureType = getSignatureType( member );
 			if ( keyPersistentAttributeType == null ) {
-				elementJavaType = (Class) signatureType.getActualTypeArguments()[0];
+				elementJavaType = getClassFromGenericArgument( signatureType.getActualTypeArguments()[0] );
 				keyJavaType = null;
 			}
 			else {
-				keyJavaType = (Class) signatureType.getActualTypeArguments()[0];
-				elementJavaType = (Class) signatureType.getActualTypeArguments()[1];
+				keyJavaType = getClassFromGenericArgument( signatureType.getActualTypeArguments()[0] );
+				elementJavaType = getClassFromGenericArgument( signatureType.getActualTypeArguments()[1] );
 			}
 
 			this.elementValueContext = new ValueContext() {
@@ -804,6 +805,23 @@
 			}
 		}
 
+		private Class<?> getClassFromGenericArgument(java.lang.reflect.Type type) {
+			Class<?> javaType;
+			Object unsafeElementType = type;
+			if ( unsafeElementType instanceof Class ) {
+				javaType = (Class) unsafeElementType;
+			}
+			else if ( unsafeElementType instanceof TypeVariable ) {
+				final java.lang.reflect.Type upperBound = ( ( TypeVariable ) unsafeElementType ).getBounds()[0];
+				javaType = getClassFromGenericArgument( upperBound );
+			}
+			else {
+				throw new AssertionFailure("Fail to process type argument in a generic declaration. Type: "
+						+ type.getClass() );
+			}
+			return javaType;
+		}
+
 		public ValueContext getElementValueContext() {
 			return elementValueContext;
 		}

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Being.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Being.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Being.java	2010-01-15 18:47:54 UTC (rev 18566)
@@ -0,0 +1,10 @@
+package org.hibernate.ejb.test.metadata;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Being {
+}

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Child.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Child.java	2010-01-15 17:58:18 UTC (rev 18565)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Child.java	2010-01-15 18:47:54 UTC (rev 18566)
@@ -10,7 +10,7 @@
  */
 @Entity
 @Table(name="ejb_child")
-public class Child {
+public class Child extends Being {
 	private Integer id;
 	private String name;
 

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java	2010-01-15 17:58:18 UTC (rev 18565)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java	2010-01-15 18:47:54 UTC (rev 18566)
@@ -274,16 +274,26 @@
 		assertNull( thing.getSupertype() );
 	}
 
-	public void testOneToManyJoinColumnUnidirectional() throws Exception {
+	public void testBackrefAndGenerics() throws Exception {
 		final EntityType<Parent> parent = factory.getMetamodel().entity( Parent.class );
 		assertNotNull( parent );
 		final SetAttribute<? super Parent, ?> children = parent.getSet( "children" );
 		assertNotNull( children );
 		assertEquals( 1, parent.getPluralAttributes().size() );
-		assertEquals( 3, parent.getAttributes().size() );
+		assertEquals( 4, parent.getAttributes().size() );
 		final EntityType<Child> child = factory.getMetamodel().entity( Child.class );
 		assertNotNull( child );
 		assertEquals( 2, child.getAttributes().size() );
+		final SingularAttribute<? super Parent, Parent.Relatives> attribute = parent.getSingularAttribute(
+				"siblings", Parent.Relatives.class
+		);
+		final EmbeddableType<Parent.Relatives> siblings = (EmbeddableType<Parent.Relatives>) attribute.getType();
+		assertNotNull(siblings);
+		final SetAttribute<? super Parent.Relatives, ?> siblingsCollection = siblings.getSet( "siblings" );
+		assertNotNull( siblingsCollection );
+		final Type<?> collectionElement = siblingsCollection.getElementType();
+		assertNotNull( collectionElement );
+		assertEquals( collectionElement, child );
 	}
 
 	private void ensureProperMember(Set<?> attributes) {

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Parent.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Parent.java	2010-01-15 17:58:18 UTC (rev 18565)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/Parent.java	2010-01-15 18:47:54 UTC (rev 18566)
@@ -1,12 +1,15 @@
 package org.hibernate.ejb.test.metadata;
 
 import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 
 
 /**
@@ -15,10 +18,28 @@
 @Entity
 @Table(name="ejb_parent")
 public class Parent {
+
+	@Embeddable
+	public static class Relatives<T extends Being> {
+		private Set<T> siblings;
+
+		@OneToMany
+		@JoinColumn(name="siblings_fk")
+		public Set<T> getSiblings() {
+			return siblings;
+		}
+
+		public void setSiblings(Set<T> siblings) {
+			this.siblings = siblings;
+		}
+	}
+
 	private Integer id;
 	private String name;
 	private Set<Child> children;
+	private Relatives<Child> siblings;
 
+
 	@Id
 	@GeneratedValue
 	public Integer getId() {
@@ -46,4 +67,14 @@
 	public void setChildren(Set<Child> children) {
 		this.children = children;
 	}
+
+	//@Transient
+	@Embedded
+	public Relatives<Child> getSiblings() {
+		return siblings;
+	}
+
+	public void setSiblings(Relatives<Child> siblings) {
+		this.siblings = siblings;
+	}
 }



More information about the hibernate-commits mailing list