diff --git a/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java b/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java index f4f96d9b9b..53adafd5d0 100644 --- a/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java +++ b/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java @@ -618,6 +618,14 @@ public class AttributeFactory { return member; } + public String getMemberDescription() { + return determineMemberDescription( getMember() ); + } + + public String determineMemberDescription(Member member) { + return member.getDeclaringClass().getName() + '#' + member.getName(); + } + public Class getJavaType() { return javaType; } @@ -823,20 +831,23 @@ public class AttributeFactory { } private Class getClassFromGenericArgument(java.lang.reflect.Type type) { - Class javaType; - Object unsafeElementType = type; - if ( unsafeElementType instanceof Class ) { - javaType = (Class) unsafeElementType; + if ( type instanceof Class ) { + return (Class) type; } - else if ( unsafeElementType instanceof TypeVariable ) { - final java.lang.reflect.Type upperBound = ( ( TypeVariable ) unsafeElementType ).getBounds()[0]; - javaType = getClassFromGenericArgument( upperBound ); + else if ( type instanceof TypeVariable ) { + final java.lang.reflect.Type upperBound = ( ( TypeVariable ) type ).getBounds()[0]; + return getClassFromGenericArgument( upperBound ); + } + else if ( type instanceof ParameterizedType ) { + final java.lang.reflect.Type rawType = ( (ParameterizedType) type ).getRawType(); + return getClassFromGenericArgument( rawType ); } else { - throw new AssertionFailure("Fail to process type argument in a generic declaration. Type: " - + type.getClass() ); + throw new AssertionFailure( + "Fail to process type argument in a generic declaration. Member : " + getMemberDescription() + + " Type: " + type.getClass() + ); } - return javaType; } public ValueContext getElementValueContext() { diff --git a/entitymanager/src/test/java/org/hibernate/ejb/test/TestCase.java b/entitymanager/src/test/java/org/hibernate/ejb/test/TestCase.java index b66b8c13b8..400f8eeb96 100644 --- a/entitymanager/src/test/java/org/hibernate/ejb/test/TestCase.java +++ b/entitymanager/src/test/java/org/hibernate/ejb/test/TestCase.java @@ -36,8 +36,8 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Environment; @@ -53,8 +53,7 @@ import org.hibernate.test.annotations.HibernateTestCase; * @author Hardy Ferentschik */ public abstract class TestCase extends HibernateTestCase { - - private static final Log log = LogFactory.getLog( TestCase.class ); + private static final Logger log = LoggerFactory.getLogger( TestCase.class ); protected static EntityManagerFactory factory; private EntityManager em; diff --git a/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java b/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java index 8d633c6069..13d7b36412 100644 --- a/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java +++ b/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java @@ -38,7 +38,10 @@ import javax.persistence.metamodel.ListAttribute; import javax.persistence.metamodel.MappedSuperclassType; import javax.persistence.metamodel.IdentifiableType; +import org.hibernate.cfg.AnnotationConfiguration; +import org.hibernate.ejb.metamodel.MetamodelImpl; import org.hibernate.ejb.test.TestCase; +import org.hibernate.engine.SessionFactoryImplementor; /** * @author Emmanuel Bernard @@ -52,6 +55,16 @@ public class MetadataTest extends TestCase { assertNotNull( entityType ); } + @SuppressWarnings({ "unchecked" }) + public void testBuildingMetamodelWithParameterizedCollection() { + AnnotationConfiguration cfg = new AnnotationConfiguration( ); + configure( cfg ); + cfg.addAnnotatedClass( WithGenericCollection.class ); + cfg.buildMappings(); + SessionFactoryImplementor sfi = (SessionFactoryImplementor) cfg.buildSessionFactory(); + MetamodelImpl.buildMetamodel( cfg.getClassMappings(), sfi ); + } + public void testLogicalManyToOne() throws Exception { final EntityType entityType = factory.getMetamodel().entity( JoinedManyToOneOwner.class ); final SingularAttribute attr = entityType.getDeclaredSingularAttribute( "house" ); @@ -218,7 +231,7 @@ public class MetadataTest extends TestCase { assertTrue( cat.hasVersionAttribute() ); assertEquals( "version", cat.getVersion(Long.class).getName() ); - verifyDeclaredVersiobnNotPresent( cat ); + verifyDeclaredVersionNotPresent( cat ); verifyDeclaredIdNotPresentAndIdPresent(cat); assertEquals( Type.PersistenceType.MAPPED_SUPERCLASS, cat.getSupertype().getPersistenceType() ); @@ -229,7 +242,7 @@ public class MetadataTest extends TestCase { assertTrue( cattish.hasVersionAttribute() ); assertEquals( "version", cattish.getVersion(Long.class).getName() ); - verifyDeclaredVersiobnNotPresent( cattish ); + verifyDeclaredVersionNotPresent( cattish ); verifyDeclaredIdNotPresentAndIdPresent(cattish); assertEquals( Type.PersistenceType.ENTITY, cattish.getSupertype().getPersistenceType() ); @@ -240,7 +253,7 @@ public class MetadataTest extends TestCase { assertTrue( feline.hasVersionAttribute() ); assertEquals( "version", feline.getVersion(Long.class).getName() ); - verifyDeclaredVersiobnNotPresent( feline ); + verifyDeclaredVersionNotPresent( feline ); verifyDeclaredIdNotPresentAndIdPresent(feline); assertEquals( Type.PersistenceType.MAPPED_SUPERCLASS, feline.getSupertype().getPersistenceType() ); @@ -251,7 +264,7 @@ public class MetadataTest extends TestCase { assertTrue( animal.hasVersionAttribute() ); assertEquals( "version", animal.getVersion(Long.class).getName() ); - verifyDeclaredVersiobnNotPresent( animal ); + verifyDeclaredVersionNotPresent( animal ); assertEquals( "id", animal.getId(Long.class).getName() ); final SingularAttribute id = animal.getDeclaredId( Long.class ); assertEquals( "id", id.getName() ); @@ -318,7 +331,7 @@ public class MetadataTest extends TestCase { } } - private void verifyDeclaredVersiobnNotPresent(IdentifiableType type) { + private void verifyDeclaredVersionNotPresent(IdentifiableType type) { try { type.getDeclaredVersion(Long.class); fail("Should not have a declared version"); diff --git a/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/WithGenericCollection.java b/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/WithGenericCollection.java new file mode 100644 index 0000000000..4cac1c2c1a --- /dev/null +++ b/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/WithGenericCollection.java @@ -0,0 +1,86 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2010, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.ejb.test.metadata; + +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; +import javax.persistence.*; + +/** +* This class has a List of mapped entity objects that are themselves parameterized. +* This class was added for JIRA issue #HHH- +* +* @author Kahli Burke +*/ +@Entity +@Table(name = "WITH_GENERIC_COLLECTION") +public class WithGenericCollection implements java.io.Serializable { + @Id + @Column(name = "ID") + private String id; + + @Basic(optional=false) + private double d; + + @ManyToOne(optional=false) + @JoinColumn(name="PARENT_ID", insertable=false, updatable=false) + private WithGenericCollection parent = null; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name="PARENT_ID") + private List> children = new ArrayList>(); + + public WithGenericCollection() { + } + + //==================================================================== + // getters and setters for State fields + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setD(double d) { + this.d = d; + } + + public double getD() { + return d; + } + + public List> getChildren() { + return children; + } + + public void setChildren(List> children) { + this.children = children; + } + + +}