diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ForeignKeyHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ForeignKeyHelper.java index d75c76de1ac8..ca6d20c27f09 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ForeignKeyHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ForeignKeyHelper.java @@ -117,13 +117,17 @@ public SingularAttributeBinding determineReferencedAttributeBinding( } final String explicitName = resolutionDelegate.getReferencedAttributeName(); - final AttributeBinding referencedAttributeBinding = explicitName != null - ? referencedEntityBinding.locateAttributeBindingByPath( explicitName, true ) - : referencedEntityBinding.locateAttributeBinding( - resolutionDelegate.getReferencedTable( resolutionContext ), - resolutionDelegate.getJoinColumns( resolutionContext ), - true - ); + final AttributeBinding referencedAttributeBinding; + if ( explicitName != null ) { + referencedAttributeBinding = referencedEntityBinding.locateAttributeBindingByPath( explicitName, true ); + } + else { + referencedAttributeBinding = referencedEntityBinding.locateAttributeBinding( + resolutionDelegate.getReferencedTable( resolutionContext ), + resolutionDelegate.getJoinColumns( resolutionContext ), + true + ); + } if ( referencedAttributeBinding == null ) { if ( explicitName != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/ClassDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/ClassDescriptorImpl.java index b5355cf35bbd..ed1ef82d54d9 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/ClassDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/ClassDescriptorImpl.java @@ -25,11 +25,13 @@ import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import org.hibernate.metamodel.reflite.spi.ClassDescriptor; import org.hibernate.metamodel.reflite.spi.FieldDescriptor; import org.hibernate.metamodel.reflite.spi.InterfaceDescriptor; +import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor; import org.hibernate.metamodel.reflite.spi.MethodDescriptor; import org.hibernate.metamodel.reflite.spi.Name; @@ -53,6 +55,7 @@ public class ClassDescriptorImpl implements ClassDescriptor { private Collection fieldDescriptors; private Collection methodDescriptors; + private List typeParameters; public ClassDescriptorImpl( Name name, @@ -127,4 +130,13 @@ void setFields(Collection fieldDescriptors) { void setMethods(Collection methodDescriptors) { this.methodDescriptors = methodDescriptors; } + + public void setTypeParameters(List typeParameters) { + this.typeParameters = typeParameters; + } + + @Override + public List getTypeParameters() { + return typeParameters; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/InterfaceDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/InterfaceDescriptorImpl.java index c20b4a03295b..f4ed3728dee8 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/InterfaceDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/InterfaceDescriptorImpl.java @@ -25,10 +25,12 @@ import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import org.hibernate.metamodel.reflite.spi.FieldDescriptor; import org.hibernate.metamodel.reflite.spi.InterfaceDescriptor; +import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor; import org.hibernate.metamodel.reflite.spi.MethodDescriptor; import org.hibernate.metamodel.reflite.spi.Name; @@ -47,6 +49,7 @@ public class InterfaceDescriptorImpl implements InterfaceDescriptor { private Collection fields; private Collection methods; + private List typeParameters; public InterfaceDescriptorImpl( Name name, @@ -105,4 +108,12 @@ void setFields(Collection fields) { void setMethods(Collection methods) { this.methods = methods; } + + public List getTypeParameters() { + return typeParameters; + } + + public void setTypeParameters(List typeParameters) { + this.typeParameters = typeParameters; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/JavaTypeDescriptorRepositoryImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/JavaTypeDescriptorRepositoryImpl.java index 3cc191c757e7..a93737cc61e4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/JavaTypeDescriptorRepositoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/internal/JavaTypeDescriptorRepositoryImpl.java @@ -25,6 +25,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -53,6 +54,11 @@ import org.jboss.jandex.MethodParameterInfo; import org.jboss.logging.Logger; +import com.fasterxml.classmate.MemberResolver; +import com.fasterxml.classmate.ResolvedType; +import com.fasterxml.classmate.ResolvedTypeWithMembers; +import com.fasterxml.classmate.TypeResolver; + /** * This is the "interim" implementation of JavaTypeDescriptorRepository that loads Classes to ascertain this * information. Ultimately the goal is to hand this responsibility off to Jandex once @@ -63,10 +69,14 @@ public class JavaTypeDescriptorRepositoryImpl implements JavaTypeDescriptorRepository { private static final Logger log = Logger.getLogger( JavaTypeDescriptorRepositoryImpl.class ); - private ClassLoader jpaTempClassLoader; + private final ClassLoader jpaTempClassLoader; private final ClassLoaderService classLoaderService; + private final IndexView jandexIndex; + private final TypeResolver classmateTypeResolver; + private final MemberResolver classmateMemberResolver; + private Map typeDescriptorMap = new HashMap(); public JavaTypeDescriptorRepositoryImpl( @@ -83,6 +93,9 @@ public JavaTypeDescriptorRepositoryImpl( this.jandexIndex = jandexIndex; this.jpaTempClassLoader = jpaTempClassLoader; this.classLoaderService = classLoaderService; + + this.classmateTypeResolver = new TypeResolver(); + this.classmateMemberResolver = new MemberResolver( classmateTypeResolver ); } @Override @@ -176,9 +189,15 @@ private JavaTypeDescriptor makeTypeDescriptor(Name typeName, Class clazz) { typeDescriptorMap.put( typeName, typeDescriptor ); typeDescriptor.setExtendedInterfaceTypes( extractInterfaces( clazz ) ); + + final ResolvedType resolvedType = classmateTypeResolver.resolve( clazz ); + typeDescriptor.setTypeParameters( extractTypeParameters( resolvedType ) ); +// final ResolvedTypeWithMembers resolvedTypeWithMembers = classmateMemberResolver.resolve( resolvedType, null, null ); + typeDescriptor.setFields( extractFields( clazz, typeDescriptor, jandexPivot ) ); typeDescriptor.setMethods( extractMethods( clazz, typeDescriptor, jandexPivot ) ); + return typeDescriptor; } else { @@ -192,6 +211,10 @@ private JavaTypeDescriptor makeTypeDescriptor(Name typeName, Class clazz) { typeDescriptor.setSuperType( extractSuper( clazz ) ); typeDescriptor.setInterfaces( extractInterfaces( clazz ) ); + + final ResolvedType resolvedType = classmateTypeResolver.resolve( clazz ); + typeDescriptor.setTypeParameters( extractTypeParameters( resolvedType ) ); + typeDescriptor.setFields( extractFields( clazz, typeDescriptor, jandexPivot ) ); typeDescriptor.setMethods( extractMethods( clazz, typeDescriptor, jandexPivot ) ); @@ -199,6 +222,18 @@ private JavaTypeDescriptor makeTypeDescriptor(Name typeName, Class clazz) { } } + private List extractTypeParameters(ResolvedType resolvedType) { + if ( resolvedType.getTypeParameters().isEmpty() ) { + return Collections.emptyList(); + } + + final List result = CollectionHelper.arrayList( resolvedType.getTypeParameters().size() ); + for ( ResolvedType typeParameter : resolvedType.getTypeParameters() ) { + result.add( getType( buildName( typeParameter.getErasedSignature() ) ) ); + } + return result; + } + private DotName toJandexName(Name typeName) { if ( DotNameAdapter.class.isInstance( typeName ) ) { return ( (DotNameAdapter) typeName ).jandexName(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/ClassDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/ClassDescriptor.java index 3adc868a0efe..59aa41784b2b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/ClassDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/ClassDescriptor.java @@ -24,6 +24,7 @@ package org.hibernate.metamodel.reflite.spi; import java.util.Collection; +import java.util.List; import java.util.Map; import org.jboss.jandex.AnnotationInstance; @@ -62,4 +63,11 @@ public interface ClassDescriptor extends JavaTypeDescriptor { * @return The annotations. */ public Map getAnnotations(); + + /** + * Get any parameters defined on the type. + * + * @return Any type parameters. + */ + public List getTypeParameters(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/InterfaceDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/InterfaceDescriptor.java index 2d141456524d..382ce6f21cba 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/InterfaceDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/reflite/spi/InterfaceDescriptor.java @@ -24,6 +24,7 @@ package org.hibernate.metamodel.reflite.spi; import java.util.Collection; +import java.util.List; import java.util.Map; import org.jboss.jandex.AnnotationInstance; @@ -48,4 +49,11 @@ public interface InterfaceDescriptor extends JavaTypeDescriptor { * @return The annotations. */ public Map getAnnotations(); + + /** + * Get any parameters defined on the type. + * + * @return Any type parameters. + */ + public List getTypeParameters(); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java index 43d42a9e0011..69331a4063d7 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java @@ -387,8 +387,10 @@ protected Class[] getAnnotatedClasses() { Ticket.class, Passport.class, Parent.class, + ParentPk.class, Child.class, Node.class, + NodePk.class, User.class, DistrictUser.class, Order.class, diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Node.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Node.java index c4477aaaab8f..4c8dab455be1 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Node.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Node.java @@ -2,6 +2,7 @@ package org.hibernate.test.annotations.manytoone; import java.io.Serializable; import javax.persistence.CascadeType; +import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; @@ -34,7 +35,7 @@ public int hashCode() { return id.hashCode(); } - @Id + @EmbeddedId public NodePk getId() { return id; } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java index 126b60f8b3c6..77aa93a53939 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java @@ -1,6 +1,7 @@ //$Id$ package org.hibernate.test.annotations.manytoone; import java.io.Serializable; +import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @@ -11,7 +12,7 @@ @Entity @Table(name = "tbl_parent") public class Parent implements Serializable { - @Id + @EmbeddedId public ParentPk id; public int age;