[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