[hibernate-commits] Hibernate SVN: r17843 - in core/trunk: core/src/main/java/org/hibernate/tuple and 6 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Oct 26 13:05:00 EDT 2009


Author: steve.ebersole at jboss.com
Date: 2009-10-26 13:04:59 -0400 (Mon, 26 Oct 2009)
New Revision: 17843

Modified:
   core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/Getter.java
   core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java
   core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java
   core/trunk/core/src/main/java/org/hibernate/property/Setter.java
   core/trunk/core/src/main/java/org/hibernate/property/package.html
   core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java
   core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java
Log:
HHH-4202 - Implement JPA 2.0 metamodel APIs


Modified: core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,12 +20,12 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.engine.SessionFactoryImplementor;
@@ -143,6 +143,13 @@
 		/**
 		 * {@inheritDoc}
 		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target) {
 			return UNKNOWN;
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,13 +20,13 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.beans.Introspector;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.slf4j.Logger;
@@ -164,6 +164,9 @@
 			this.propertyName=propertyName;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target) throws HibernateException {
 			try {
 				return method.invoke(target, null);
@@ -202,18 +205,37 @@
 			}
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
 			return get( target );
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return method.getReturnType();
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return method;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return method;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return method.getName();
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,7 +20,6 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 

Modified: core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,12 +20,12 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -50,6 +50,10 @@
 			this.clazz = clazz;
 			this.name = name;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target) throws HibernateException {
 			try {
 				return field.get(target);
@@ -59,16 +63,37 @@
 			}
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
 			return get( target );
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return field;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return field.getType();
 		}
@@ -91,12 +116,24 @@
 			this.clazz = clazz;
 			this.name = name;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {
 			try {
 				field.set(target, value);

Modified: core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,11 +20,11 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.dom4j.Attribute;
@@ -53,7 +53,6 @@
 		this.factory = factory;
 		this.nodeName = nodeName;
 		this.propertyType = propertyType;
-		
 	}
 
 	/**
@@ -118,21 +117,28 @@
 		}
 
 		/**
-		 * Get the declared Java type
+		 * {@inheritDoc}
 		 */
 		public Class getReturnType() {
 			return Object.class;
 		}
 
 		/**
-		 * Optional operation (return null)
+		 * {@inheritDoc}
 		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
 		/**
-		 * Optional operation (return null)
+		 * {@inheritDoc}
 		 */
 		public Method getMethod() {
 			return null;
@@ -147,14 +153,14 @@
 		}
 		
 		/**
-		 * Optional operation (return null)
+		 * {@inheritDoc}
 		 */
 		public String getMethodName() {
 			return null;
 		}
 
 		/**
-		 * Optional operation (return null)
+		 * {@inheritDoc}
 		 */
 		public Method getMethod() {
 			return null;
@@ -166,16 +172,17 @@
 	 * @author Gavin King
 	 */
 	public static class TextGetter extends Dom4jGetter {
-		
 		TextGetter(Type propertyType, SessionFactoryImplementor factory) {
 			super(propertyType, factory);
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object owner) throws HibernateException {
 			Element ownerElement = (Element) owner;
 			return super.propertyType.fromXMLNode(ownerElement, super.factory);
 		}	
-		
 	}
 	
 	/**
@@ -184,19 +191,21 @@
 	 */
 	public static class AttributeGetter extends Dom4jGetter {
 		private final String attributeName;
-		
+
 		AttributeGetter(String name, Type propertyType, SessionFactoryImplementor factory) {
 			super(propertyType, factory);
 			attributeName = name.substring(1);
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object owner) throws HibernateException {
 			Element ownerElement = (Element) owner;
 			Node attribute = ownerElement.attribute(attributeName);
 			return attribute==null ? null : 
 				super.propertyType.fromXMLNode(attribute, super.factory);
 		}	
-		
 	}
 
 	/**
@@ -211,13 +220,15 @@
 			elementName = name;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object owner) throws HibernateException {
 			Element ownerElement = (Element) owner;
 			Node element = ownerElement.element(elementName);
 			return element==null ? 
 					null : super.propertyType.fromXMLNode(element, super.factory);
 		}	
-		
 	}
 	
 	/**
@@ -227,13 +238,16 @@
 	public static class ElementAttributeGetter extends Dom4jGetter {
 		private final String elementName;
 		private final String attributeName;
-		
+
 		ElementAttributeGetter(String name, Type propertyType, SessionFactoryImplementor factory) {
 			super(propertyType, factory);
 			elementName = name.substring( 0, name.indexOf('/') );
 			attributeName = name.substring( name.indexOf('/')+2 );
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object owner) throws HibernateException {
 			Element ownerElement = (Element) owner;
 			
@@ -260,12 +274,14 @@
 	 * @author Gavin King
 	 */
 	public static class TextSetter extends Dom4jSetter {
-		
 		TextSetter(Type propertyType) {
 			super(propertyType);
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) 
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory)
 		throws HibernateException {
 			Element owner = ( Element ) target;
 			if ( !super.propertyType.isXMLElement() ) { //kinda ugly, but needed for collections with a "." node mapping
@@ -277,7 +293,6 @@
 				}
 			}
 		}
-
 	}
 	
 	/**
@@ -286,13 +301,16 @@
 	 */
 	public static class AttributeSetter extends Dom4jSetter {
 		private final String attributeName;
-		
+
 		AttributeSetter(String name, Type propertyType) {
 			super(propertyType);
 			attributeName = name.substring(1);
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) 
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory)
 		throws HibernateException {
 			Element owner = ( Element ) target;
 			Attribute attribute = owner.attribute(attributeName);
@@ -307,7 +325,6 @@
 				super.propertyType.setToXMLNode(attribute, value, factory);
 			}
 		}
-
 	}
 	
 	/**
@@ -322,7 +339,10 @@
 			elementName = name;
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) 
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory)
 		throws HibernateException {
 			if (value!=CollectionType.UNFETCHED_COLLECTION) {
 				Element owner = ( Element ) target;
@@ -334,7 +354,6 @@
 				}
 			}
 		}
-
 	}
 	
 	/**
@@ -351,7 +370,10 @@
 			attributeName = name.substring( name.indexOf('/')+2 );
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) 
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory)
 		throws HibernateException {
 			Element owner = ( Element ) target;
 			Element element = owner.element(elementName);
@@ -375,7 +397,6 @@
 				super.propertyType.setToXMLNode(attribute, value, factory);
 			}
 		}
-
 	}
 	
 

Modified: core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,11 +20,11 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -38,29 +38,50 @@
 public class EmbeddedPropertyAccessor implements PropertyAccessor {
 	
 	public static final class EmbeddedGetter implements Getter {
-		
 		private final Class clazz;
 		
 		EmbeddedGetter(Class clazz) {
 			this.clazz = clazz;
 		}
 		
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target) throws HibernateException {
 			return target;
 		}
 		
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
 			return get( target );
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return clazz;
 		}
@@ -71,23 +92,35 @@
 	}
 
 	public static final class EmbeddedSetter implements Setter {
-		
 		private final Class clazz;
 		
 		EmbeddedSetter(Class clazz) {
 			this.clazz = clazz;
 		}
 		
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {}
-		
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory) {
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public String toString() {
 			return "EmbeddedSetter(" + clazz.getName() + ')';
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/property/Getter.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Getter.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Getter.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,12 +20,12 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -58,17 +58,35 @@
 	throws HibernateException;
 
 	/**
-	 * Get the declared Java type
+	 * Retrieve the member to which this property maps.  This might be the
+	 * field or it might be the getter method.
+	 *
+	 * @return The mapped member.
 	 */
+	public Member getMember();
+
+	/**
+	 * Retrieve the declared Java type
+	 *
+	 * @return The declared java type.
+	 */
 	public Class getReturnType();
 
 	/**
+	 * Retrieve the getter-method name.
+	 * <p/>
 	 * Optional operation (return null)
+	 *
+	 * @return The name of the getter method, or null.
 	 */
 	public String getMethodName();
 
 	/**
+	 * Retrieve the getter-method.
+	 * <p/>
 	 * Optional operation (return null)
+	 *
+	 * @return The getter method, or null.
 	 */
 	public Method getMethod();
 }

Modified: core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,11 +20,11 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -37,7 +37,6 @@
  * @author Gavin King
  */
 public class IndexPropertyAccessor implements PropertyAccessor {
-	
 	private final String propertyName;
 	private final String entityName;
 
@@ -45,6 +44,7 @@
 	 * Constructs a new instance of IndexPropertyAccessor.
 	 *
 	 * @param collectionRole The collection role which this back ref references.
+	 * @param entityName The name of the entity owning the collection.
 	 */
 	public IndexPropertyAccessor(String collectionRole, String entityName) {
 		this.propertyName = collectionRole.substring( entityName.length()+1 );
@@ -64,23 +64,27 @@
 	 * The Setter implementation for index backrefs.
 	 */
 	public static final class IndexSetter implements Setter {
-
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
-		public void set(Object target, Object value) {
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor factory) {
 			// do nothing...
 		}
 
-		public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {
-			// do nothing...
-		}
-
 	}
 
 
@@ -88,7 +92,6 @@
 	 * The Getter implementation for index backrefs.
 	 */
 	public class IndexGetter implements Getter {
-		
 		public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) throws HibernateException {
 			if (session==null) {
 				return BackrefPropertyAccessor.UNKNOWN;
@@ -99,18 +102,37 @@
 			}
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target)  {
 			return BackrefPropertyAccessor.UNKNOWN;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return Object.class;
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,11 +20,11 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -36,33 +36,46 @@
  * @author Gavin King
  */
 public class MapAccessor implements PropertyAccessor {
-
+	/**
+	 * {@inheritDoc}
+	 */
 	public Getter getGetter(Class theClass, String propertyName)
 		throws PropertyNotFoundException {
 		return new MapGetter(propertyName);
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	public Setter getSetter(Class theClass, String propertyName)
 		throws PropertyNotFoundException {
 		return new MapSetter(propertyName);
 	}
 
 	public static final class MapSetter implements Setter {
-
 		private String name;
 
 		MapSetter(String name) {
 			this.name = name;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public void set(Object target, Object value, SessionFactoryImplementor factory)
 			throws HibernateException {
 			( (Map) target ).put(name, value);
@@ -71,33 +84,53 @@
 	}
 
 	public static final class MapGetter implements Getter {
-
 		private String name;
 
 		MapGetter(String name) {
 			this.name = name;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object get(Object target) throws HibernateException {
 			return ( (Map) target ).get(name);
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
 			return get( target );
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return Object.class;
 		}
-
 	}
 
 }

Modified: core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,11 +20,11 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Member;
 import java.util.Map;
 
 import org.hibernate.HibernateException;
@@ -38,11 +38,16 @@
  * @author Michael Bartmann
  */
 public class NoopAccessor implements PropertyAccessor {
-
+	/**
+	 * {@inheritDoc}
+	 */
 	public Getter getGetter(Class arg0, String arg1) throws PropertyNotFoundException {
 		return new NoopGetter();
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	public Setter getSetter(Class arg0, String arg1) throws PropertyNotFoundException {
 		return new NoopSetter();
 	}
@@ -51,47 +56,73 @@
 	 * A Getter which will always return null. It should not be called anyway.
 	 */
 	private static class NoopGetter implements Getter {
-
 		/**
-		 * @return always null
+		 * {@inheritDoc}
+		 * <p/>
+		 * Here we always return <tt>null</tt>
 		 */
 		public Object get(Object target) throws HibernateException {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Object getForInsert(Object target, Map map, SessionImplementor arg1)
 				throws HibernateException {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Class getReturnType() {
 			return Object.class;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
+		public Member getMember() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}
-
 	}
 
 	/**
 	 * A Setter which will just do nothing.
 	 */
 	private static class NoopSetter implements Setter {
-
-		public void set(Object target, Object value, SessionFactoryImplementor arg2)
-				throws HibernateException {
-			// do not do anything
+		/**
+		 * {@inheritDoc}
+		 */
+		public void set(Object target, Object value, SessionFactoryImplementor arg2) {
+			// nothing to do
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public String getMethodName() {
 			return null;
 		}
 
+		/**
+		 * {@inheritDoc}
+		 */
 		public Method getMethod() {
 			return null;
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,7 +20,6 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 
@@ -29,15 +28,31 @@
 /**
  * Abstracts the notion of a "property". Defines a strategy for accessing the
  * value of an attribute.
+ *
  * @author Gavin King
  */
 public interface PropertyAccessor {
 	/**
 	 * Create a "getter" for the named attribute
+	 *
+	 * @param theClass The class on which the property is defined.
+	 * @param propertyName The name of the property.
+	 *
+	 * @return An appropriate getter.
+	 *
+	 * @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
 	 */
 	public Getter getGetter(Class theClass, String propertyName) throws PropertyNotFoundException;
+
 	/**
 	 * Create a "setter" for the named attribute
+	 *
+	 * @param theClass The class on which the property is defined.
+	 * @param propertyName The name of the property.
+	 *
+	 * @return An appropriate setter
+	 *
+	 * @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
 	 */
 	public Setter getSetter(Class theClass, String propertyName) throws PropertyNotFoundException;
 }

Modified: core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,7 +20,6 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 

Modified: core/trunk/core/src/main/java/org/hibernate/property/Setter.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Setter.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Setter.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @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
@@ -20,7 +20,6 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.property;
 

Modified: core/trunk/core/src/main/java/org/hibernate/property/package.html
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/package.html	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/package.html	2009-10-26 17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
 <!--
   ~ Hibernate, Relational Persistence for Idiomatic Java
   ~
-  ~ Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
+  ~ Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+  ~ third-party contributors as indicated by either @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
@@ -20,7 +20,6 @@
   ~ Free Software Foundation, Inc.
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
-  ~
   -->
 
 <html>

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -25,6 +25,7 @@
 package org.hibernate.tuple;
 
 import org.hibernate.HibernateException;
+import org.hibernate.property.Getter;
 
 /**
  * A tuplizer defines the contract for things which know how to manage
@@ -56,24 +57,21 @@
  * @author Steve Ebersole
  */
 public interface Tuplizer {
-
 	/**
 	 * Extract the current values contained on the given entity.
 	 *
 	 * @param entity The entity from which to extract values.
 	 * @return The current property values.
-	 * @throws HibernateException
 	 */
-	public Object[] getPropertyValues(Object entity) throws HibernateException;
+	public Object[] getPropertyValues(Object entity);
 
 	/**
 	 * Inject the given values into the given entity.
 	 *
 	 * @param entity The entity.
 	 * @param values The values to be injected.
-	 * @throws HibernateException
 	 */
-	public void setPropertyValues(Object entity, Object[] values) throws HibernateException;
+	public void setPropertyValues(Object entity, Object[] values);
 
 	/**
 	 * Extract the value of a particular property from the given entity.
@@ -81,17 +79,15 @@
 	 * @param entity The entity from which to extract the property value.
 	 * @param i The index of the property for which to extract the value.
 	 * @return The current value of the given property on the given entity.
-	 * @throws HibernateException
 	 */
-	public Object getPropertyValue(Object entity, int i) throws HibernateException;
+	public Object getPropertyValue(Object entity, int i);
 
 	/**
 	 * Generate a new, empty entity.
 	 *
 	 * @return The new, empty entity instance.
-	 * @throws HibernateException
 	 */
-	public Object instantiate() throws HibernateException;
+	public Object instantiate();
 	
 	/**
 	 * Is the given object considered an instance of the the entity (acconting
@@ -115,4 +111,11 @@
 	 */
 	public Class getMappedClass();
 
+	/**
+	 * Retrieve the getter for the specified property.
+	 *
+	 * @param i The property index.
+	 * @return The property getter.
+	 */
+	public Getter getGetter(int i);
 }

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -42,7 +42,6 @@
  * @author Steve Ebersole
  */
 public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
-
 	protected final Getter[] getters;
 	protected final Setter[] setters;
 	protected final int propertySpan;
@@ -71,15 +70,6 @@
 			i++;
 		}
 		hasCustomAccessors = foundCustomAccessor;
-
-		String[] getterNames = new String[propertySpan];
-		String[] setterNames = new String[propertySpan];
-		Class[] propTypes = new Class[propertySpan];
-		for ( int j = 0; j < propertySpan; j++ ) {
-			getterNames[j] = getters[j].getMethodName();
-			setterNames[j] = setters[j].getMethodName();
-			propTypes[j] = getters[j].getReturnType();
-		}
 		instantiator = buildInstantiator( component );
 	}
 
@@ -128,4 +118,7 @@
 		throw new UnsupportedOperationException();
 	}
 
+	public Getter getGetter(int i) {
+		return getters[i];
+	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -51,7 +51,6 @@
  * @author Steve Ebersole
  */
 public class PojoComponentTuplizer extends AbstractComponentTuplizer {
-
 	private final Class componentClass;
 	private ReflectionOptimizer optimizer;
 	private final Getter parentGetter;

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -140,7 +140,9 @@
 			Property property = (Property) iter.next();
 			getters[i] = buildPropertyGetter(property, mappingInfo);
 			setters[i] = buildPropertySetter(property, mappingInfo);
-			if ( !property.isBasicPropertyAccessor() ) foundCustomAccessor = true;
+			if ( !property.isBasicPropertyAccessor() ) {
+				foundCustomAccessor = true;
+			}
 			i++;
 		}
 		hasCustomAccessors = foundCustomAccessor;
@@ -423,4 +425,18 @@
 		return getClass().getName() + '(' + getEntityMetamodel().getName() + ')';
 	}
 
+	public Getter getIdentifierGetter() {
+		return idGetter;
+	}
+
+	public Getter getVersionGetter() {
+		if ( getEntityMetamodel().isVersioned() ) {
+			return getGetter( getEntityMetamodel().getVersionPropertyIndex() );
+		}
+		return null;
+	}
+
+	public Getter getGetter(int i) {
+		return getters[i];
+	}
 }

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -30,6 +30,7 @@
 import org.hibernate.HibernateException;
 import org.hibernate.EntityNameResolver;
 import org.hibernate.EntityMode;
+import org.hibernate.property.Getter;
 import org.hibernate.tuple.Tuplizer;
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.engine.SessionFactoryImplementor;
@@ -238,4 +239,18 @@
 	 * @throws HibernateException If we are unable to determine an entity-name within the inheritence hierarchy.
 	 */
 	public String determineConcreteSubclassEntityName(Object entityInstance, SessionFactoryImplementor factory);
+
+	/**
+	 * Retrieve the getter for the identifier property.  May return null.
+	 *
+	 * @return The getter for the identifier property.
+	 */
+	public Getter getIdentifierGetter();
+
+	/**
+	 * Retrieve the getter for the version property.  May return null.
+	 *
+	 * @return The getter for the version property.
+	 */
+	public Getter getVersionGetter();
 }
\ No newline at end of file

Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -64,7 +64,6 @@
  * @author Gavin King
  */
 public class PojoEntityTuplizer extends AbstractEntityTuplizer {
-
 	static final Logger log = LoggerFactory.getLogger( PojoEntityTuplizer.class );
 
 	private final Class mappedClass;

Modified: core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -38,6 +38,7 @@
 import org.hibernate.FetchMode;
 import org.hibernate.HibernateException;
 import org.hibernate.MappingException;
+import org.hibernate.PropertyNotFoundException;
 import org.hibernate.engine.CascadeStyle;
 import org.hibernate.engine.Mapping;
 import org.hibernate.engine.SessionFactoryImplementor;
@@ -88,6 +89,10 @@
 		this.tuplizerMapping = metamodel.getTuplizerMapping();
 	}
 
+	public EntityModeToTuplizerMapping getTuplizerMapping() {
+		return tuplizerMapping;
+	}
+
 	public int[] sqlTypes(Mapping mapping) throws MappingException {
 		//Not called at runtime so doesn't matter if its slow :)
 		int[] sqlTypes = new int[getColumnSpan( mapping )];
@@ -656,4 +661,15 @@
 		return false;
 	}
 
+	public int getPropertyIndex(String name) {
+		String[] names = getPropertyNames();
+		for ( int i = 0, max = names.length; i < max; i++ ) {
+			if ( names[i].equals( name ) ) {
+				return i;
+			}
+		}
+		throw new PropertyNotFoundException(
+				"Unable to locate property named " + name + " on " + getReturnedClass().getName()
+		);
+	}
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -35,6 +35,7 @@
 import javax.persistence.spi.LoadState;
 
 import org.hibernate.SessionFactory;
+import org.hibernate.engine.SessionFactoryImplementor;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
@@ -71,7 +72,7 @@
 		final Iterator<PersistentClass> classes = cfg.getClassMappings();
 		//a safe guard till we are confident that metamodel is wll tested
 		if ( !"disabled".equalsIgnoreCase( cfg.getProperty( "hibernate.ejb.metamodel.generation" ) ) ) {
-			this.metamodel = new MetamodelImpl( classes );
+			this.metamodel = MetamodelImpl.buildMetamodel( classes, ( SessionFactoryImplementor ) sessionFactory );
 		}
 		else {
 			this.metamodel = null;

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -87,16 +87,18 @@
 	 * {@inheritDoc}
 	 */
 	@SuppressWarnings({ "unchecked" })
-	public <Y> SingularAttribute<? super X, Y> getId(Class<Y> type) {
+	public <Y> SingularAttribute<? super X, Y> getId(Class<Y> javaType) {
 		final SingularAttribute<? super X, Y> id_;
 		if ( id != null ) {
 			checkSimpleId();
 			id_ = ( SingularAttribute<? super X, Y> ) id;
+			if ( javaType != id.getJavaType() ) {
+				throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
+			}
 		}
 		else {
-			id_ = requireSupertype().getId( type );
+			id_ = requireSupertype().getId( javaType );
 		}
-		// TODO : check that type and id_.getJavaType() are related
 		return id_;
 	}
 
@@ -117,10 +119,12 @@
 	 * {@inheritDoc}
 	 */
 	@SuppressWarnings({ "unchecked" })
-	public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> yClass) {
+	public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> javaType) {
 		checkDeclaredId();
 		checkSimpleId();
-		// TODO : check that type and id.getJavaType() are related
+		if ( javaType != id.getJavaType() ) {
+			throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
+		}
 		return (SingularAttribute<X, Y>) id;
 	}
 
@@ -177,18 +181,20 @@
 	 * {@inheritDoc}
 	 */
 	@SuppressWarnings({ "unchecked" })
-	public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> type) {
+	public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> javaType) {
 		if ( ! hasVersionAttribute() ) {
 			return null;
 		}
 		final SingularAttribute<? super X, Y> version_;
 		if ( version != null ) {
 			version_ = ( SingularAttribute<? super X, Y> ) version;
+			if ( javaType != version.getJavaType() ) {
+				throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
+			}
 		}
 		else {
-			version_ = requireSupertype().getVersion( type );
+			version_ = requireSupertype().getVersion( javaType );
 		}
-		// TODO : check that type and version_.getJavaType() are related
 		return version_;
 	}
 
@@ -196,9 +202,11 @@
 	 * {@inheritDoc}
 	 */
 	@SuppressWarnings({ "unchecked" })
-	public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> yClass) {
+	public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> javaType) {
 		checkDeclaredVersion();
-		// TODO : check that type and version_.getJavaType() are related
+		if ( javaType != version.getJavaType() ) {
+			throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
+		}
 		return ( SingularAttribute<X, Y> ) version;
 	}
 

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	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -23,18 +23,22 @@
  */
 package org.hibernate.ejb.metamodel;
 
+import java.lang.reflect.Member;
 import java.util.Iterator;
-import java.lang.reflect.Member;
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Type;
 
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Value;
+import org.hibernate.EntityMode;
+import org.hibernate.type.EmbeddedComponentType;
+import org.hibernate.type.ComponentType;
+import org.hibernate.annotations.common.AssertionFailure;
 import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
 import org.hibernate.mapping.Map;
-import org.hibernate.mapping.Component;
 import org.hibernate.mapping.OneToMany;
-import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Value;
+import org.hibernate.tuple.entity.EntityMetamodel;
 
 /**
  * TODO : javadoc
@@ -57,12 +61,12 @@
 			attribute = buildPluralAttribute( ownerType, property, attrContext );
 		}
 		else {
-			final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
+			final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
 			attribute = new SingularAttributeImpl<X,Y>(
 					property.getName(),
 					property.getType().getReturnedClass(),
 					ownerType,
-					determineJavaMember( property ),
+					determineStandardJavaMember( ownerType, property ),
 					false,
 					false,
 					property.isOptional(),
@@ -76,19 +80,19 @@
 	@SuppressWarnings( "unchecked" )
 	private <X, Y, V, K> AttributeImplementor<X, Y> buildPluralAttribute(AbstractManagedType<X> ownerType, Property property, AttributeContext attrContext) {
 		AttributeImplementor<X, Y> attribute;
-		final Type<V> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
+		final Type<V> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
 		final Class<Y> collectionClass = (Class<Y>) attrContext.getCollectionClass();
 		if ( java.util.Map.class.isAssignableFrom( collectionClass ) ) {
-			final Type<K> keyType = getType( attrContext.getKeyTypeStatus(), attrContext.getKeyValue() );
+			final Type<K> keyType = getType( ownerType, attrContext.getKeyTypeStatus(), attrContext.getKeyValue() );
 			attribute = PluralAttributeImpl.create( ownerType, attrType, collectionClass, keyType )
-					.member( determineJavaMember( property ) )
+					.member( determineStandardJavaMember( ownerType, property ) )
 					.property( property )
 					.persistentAttributeType( attrContext.getElementAttributeType() )
 					.build();
 		}
 		else {
 			attribute =  PluralAttributeImpl.create( ownerType, attrType, collectionClass, null )
-					.member( determineJavaMember( property ) )
+					.member( determineStandardJavaMember( ownerType, property ) )
 					.property( property )
 					.persistentAttributeType( attrContext.getElementAttributeType() )
 					.build();
@@ -96,13 +100,13 @@
 		return attribute;
 	}
 
-	private <X> Type<X> getType(AttributeContext.TypeStatus elementTypeStatus, Value value) {
+	private <X> Type<X> getType(AbstractManagedType owner, AttributeContext.TypeStatus elementTypeStatus, Value value) {
 		final org.hibernate.type.Type type = value.getType();
 		switch ( elementTypeStatus ) {
 			case BASIC:
 				return buildBasicType( type );
 			case EMBEDDABLE:
-				return buildEmbeddableType( value, type );
+				return buildEmbeddableType( owner, value, type );
 			case ENTITY:
 				return buildEntityType( type );
 			default:
@@ -124,10 +128,10 @@
 	}
 
 	@SuppressWarnings( "unchecked" )
-	private <X> Type<X> buildEmbeddableType(Value value, org.hibernate.type.Type type) {
+	private <X> Type<X> buildEmbeddableType(AbstractManagedType owner, Value value, org.hibernate.type.Type type) {
 		//build embedable type
 		final Class<X> clazz = type.getReturnedClass();
-		final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>( clazz );
+		final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>( clazz, owner, (ComponentType) type );
 		context.registerEmbeddedableType( embeddableType );
 		final Component component = (Component) value;
 		final Iterator<Property> subProperties = component.getPropertyIterator();
@@ -142,38 +146,115 @@
 	@SuppressWarnings({ "unchecked" })
 	public <X, Y> SingularAttributeImpl<X, Y> buildIdAttribute(AbstractManagedType<X> ownerType, Property property) {
 		final AttributeContext attrContext = getAttributeContext( property );
-		final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
+		final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
 		final Class<Y> idJavaType = property.getType().getReturnedClass();
 		return new SingularAttributeImpl.Identifier(
 				property.getName(),
 				idJavaType,
 				ownerType,
-				determineJavaMember( property ),
+				determineIdentifierJavaMember( ownerType, property ),
 				attrType,
 				attrContext.getElementAttributeType()
 		);
 	}
 
-	@SuppressWarnings({ "UnusedDeclaration" })
-	private Member determineJavaMember(Property property) {
-		return null;
+	private Member determineIdentifierJavaMember(AbstractManagedType ownerType, Property property) {
+// see below
+//		final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
+		final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+		if ( ! property.getName().equals( entityMetamodel.getIdentifierProperty().getName() ) ) {
+			// this *should* indicate processing part of an IdClass...
+			return determineVirtualIdentifierJavaMember( entityMetamodel, property );
+		}
+		return entityMetamodel.getTuplizer( EntityMode.POJO ).getIdentifierGetter().getMember();
 	}
 
+	private Member determineVirtualIdentifierJavaMember(EntityMetamodel entityMetamodel, Property property) {
+		if ( ! entityMetamodel.getIdentifierProperty().isVirtual() ) {
+			throw new IllegalArgumentException( "expecting IdClass mapping" );
+		}
+		org.hibernate.type.Type type = entityMetamodel.getIdentifierProperty().getType();
+		if ( ! EmbeddedComponentType.class.isInstance( type ) ) {
+			throw new IllegalArgumentException( "expecting IdClass mapping" );
+		}
+		final EmbeddedComponentType componentType = (EmbeddedComponentType) type;
+		return componentType.getTuplizerMapping()
+				.getTuplizer( EntityMode.POJO )
+				.getGetter( componentType.getPropertyIndex( property.getName() ) )
+				.getMember();
+	}
+
+// getting the owning PersistentClass from the Property is broken in certain cases with annotations...
+//	private EntityMetamodel getDeclarerEntityMetamodel(Property property) {
+//		return context.getSessionFactory()
+//				.getEntityPersister( property.getPersistentClass().getEntityName() )
+//				.getEntityMetamodel();
+//	}
+// so we use the owner's java class to lookup the persister/entitymetamodel
+	private EntityMetamodel getDeclarerEntityMetamodel(AbstractManagedType ownerType) {
+		return context.getSessionFactory()
+				.getEntityPersister( ownerType.getJavaType().getName() )
+				.getEntityMetamodel();
+	}
+
+// getting the owning PersistentClass from the Property is broken in certain cases with annotations...
+//	private Member determineStandardJavaMember(Property property) {
+//		final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
+//
+//		final String propertyName = property.getName();
+//		final int index = entityMetamodel.getPropertyIndex( propertyName );
+//		return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index ).getMember();
+//	}
+// so we use the owner's java class to lookup the persister/entitymetamodel
+	private Member determineStandardJavaMember(AbstractManagedType ownerType, Property property) {
+		if ( Type.PersistenceType.EMBEDDABLE == ownerType.getPersistenceType() ) {
+			EmbeddableTypeImpl embeddableType = ( EmbeddableTypeImpl ) ownerType;
+			return embeddableType.getHibernateType().getTuplizerMapping()
+					.getTuplizer( EntityMode.POJO )
+					.getGetter( embeddableType.getHibernateType().getPropertyIndex( property.getName() ) )
+					.getMember();
+		}
+		else if ( Type.PersistenceType.ENTITY == ownerType.getPersistenceType() ) {
+			final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+			final String propertyName = property.getName();
+			final Integer index = entityMetamodel.getPropertyIndexOrNull( propertyName );
+			if ( index == null ) {
+				// just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping
+				return determineVirtualIdentifierJavaMember( entityMetamodel, property );
+			}
+			else {
+				return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index ).getMember();
+			}
+		}
+		else {
+			throw new IllegalArgumentException( "Unexpected owner type : " + ownerType.getPersistenceType() );
+		}
+	}
+
 	@SuppressWarnings({ "unchecked" })
 	public <X, Y> SingularAttributeImpl<X, Y> buildVerisonAttribute(AbstractManagedType<X> ownerType, Property property) {
 		final AttributeContext attrContext = getAttributeContext( property );
 		final Class<Y> javaType = property.getType().getReturnedClass();
-		final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
+		final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
 		return new SingularAttributeImpl.Version(
 				property.getName(),
 				javaType,
 				ownerType,
-				determineJavaMember( property ),
+				determineVersionJavaMember( ownerType, property ),
 				attrType,
 				attrContext.getElementAttributeType()
 		);
 	}
 
+	private Member determineVersionJavaMember(AbstractManagedType ownerType, Property property) {
+		final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+		if ( ! property.getName().equals( entityMetamodel.getVersionProperty().getName() ) ) {
+			// this should never happen, but to be safe...
+			throw new IllegalArgumentException( "Given property did not match declared version property" );
+		}
+		return entityMetamodel.getTuplizer( EntityMode.POJO ).getIdentifierGetter().getMember();
+	}
+
 	private static class AttributeContext {
 		private final Value elementValue;
 		private final TypeStatus typeStatus;

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -21,11 +21,10 @@
  */
 package org.hibernate.ejb.metamodel;
 
-import java.util.Iterator;
 import java.io.Serializable;
 import javax.persistence.metamodel.EmbeddableType;
 
-import org.hibernate.mapping.Property;
+import org.hibernate.type.ComponentType;
 
 /**
  * @author Emmanuel Bernard
@@ -34,11 +33,24 @@
 		extends AbstractManagedType<X>
 		implements EmbeddableType<X>, Serializable {
 
-	public EmbeddableTypeImpl(Class<X> javaType) {
+	private final AbstractManagedType parent;
+	private final ComponentType hibernateType;
+
+	public EmbeddableTypeImpl(Class<X> javaType, AbstractManagedType parent, ComponentType hibernateType) {
 		super( javaType, null );
+		this.parent = parent;
+		this.hibernateType = hibernateType;
 	}
 
 	public PersistenceType getPersistenceType() {
 		return PersistenceType.EMBEDDABLE;
 	}
+
+	public AbstractManagedType getParent() {
+		return parent;
+	}
+
+	public ComponentType getHibernateType() {
+		return hibernateType;
+	}
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -33,6 +33,7 @@
 
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.Property;
+import org.hibernate.engine.SessionFactoryImplementor;
 
 /**
  * Defines a context for storing information during the building of the {@link MetamodelImpl}.
@@ -44,6 +45,7 @@
  * @author Emmanuel Bernard
  */
 class MetadataContext {
+	private final SessionFactoryImplementor sessionFactory;
 	private final AttributeFactory attributeFactory = new AttributeFactory( this );
 
 	private HashMap<Class<?>,EntityTypeImpl<?>> entityTypes
@@ -55,6 +57,14 @@
 	private HashMap<Class<?>, EmbeddableTypeImpl<?>> embeddables
 			= new HashMap<Class<?>, EmbeddableTypeImpl<?>>();
 
+	public MetadataContext(SessionFactoryImplementor sessionFactory) {
+		this.sessionFactory = sessionFactory;
+	}
+
+	/*package*/ SessionFactoryImplementor getSessionFactory() {
+		return sessionFactory;
+	}
+
 	/**
 	 * Given a Hibernate {@link PersistentClass}, locate the corresponding JPA {@link org.hibernate.type.EntityType}
 	 * implementation.  May retur null if the given {@link PersistentClass} has not yet been processed.

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -32,6 +32,7 @@
 import javax.persistence.metamodel.EmbeddableType;
 
 import org.hibernate.mapping.PersistentClass;
+import org.hibernate.engine.SessionFactoryImplementor;
 
 /**
  * Hibernate implementation of the JPA {@link Metamodel} contract.
@@ -44,21 +45,25 @@
 	private final Map<Class<?>, EmbeddableTypeImpl<?>> embeddables;
 
 	/**
-	 * Instantiate the metamodel from the collection of Hibernate {@link PersistentClass} models.
+	 * Build the metamodel using the information from the collection of Hibernate
+	 * {@link PersistentClass} models as well as the Hibernate {@link SessionFactory}.
 	 *
-	 * @param persistentClasses An iterator over the Hibernate {@link PersistentClass} models.
+	 * @param persistentClasses Iterator over the Hibernate (config-time) metamodel
+	 * @param sessionFactory The Hibernate session factry.
+	 * @return The built metamodel
 	 */
-	public MetamodelImpl(Iterator<PersistentClass> persistentClasses) {
-		MetadataContext context = new MetadataContext();
+	public static MetamodelImpl buildMetamodel(
+			Iterator<PersistentClass> persistentClasses,
+			SessionFactoryImplementor sessionFactory) {
+		MetadataContext context = new MetadataContext( sessionFactory );
 		while ( persistentClasses.hasNext() ) {
 			locateOrBuildEntityType( persistentClasses.next(), context );
 		}
-		this.entities = context.getEntityTypeMap();
 		context.wrapUp();
-		this.embeddables = context.getEmbeddableTypeMap();
+		return new MetamodelImpl( context.getEntityTypeMap(), context.getEmbeddableTypeMap() );
 	}
 
-	private EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass persistentClass, MetadataContext context) {
+	private static EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass persistentClass, MetadataContext context) {
 		EntityTypeImpl<?> entityType = context.locateEntityType( persistentClass );
 		if ( entityType == null ) {
 			entityType = buildEntityType( persistentClass, context );
@@ -67,7 +72,7 @@
 	}
 
 	@SuppressWarnings({ "unchecked" })
-	private EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass, MetadataContext context) {
+	private static EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass, MetadataContext context) {
 		final PersistentClass superPersistentClass = persistentClass.getSuperclass();
 		final EntityTypeImpl superEntityType = superPersistentClass == null
 				? null
@@ -85,6 +90,19 @@
 	}
 
 	/**
+	 * Instantiate the metamodel.
+	 *
+	 * @param entities The entity mappings.
+	 * @param embeddables The embeddable (component) mappings.
+	 */
+	private MetamodelImpl(
+			Map<Class<?>, EntityTypeImpl<?>> entities,
+			Map<Class<?>, EmbeddableTypeImpl<?>> embeddables) {
+		this.entities = entities;
+		this.embeddables = embeddables;
+	}
+
+	/**
 	 * {@inheritDoc}
 	 */
 	@SuppressWarnings({ "unchecked" })

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	2009-10-26 16:45:45 UTC (rev 17842)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java	2009-10-26 17:04:59 UTC (rev 17843)
@@ -37,6 +37,16 @@
 		final SingularAttribute<Fridge, Long> id = fridgeType.getDeclaredId( Long.class );
 		assertNotNull( id );
 		assertTrue( id.isId() );
+		try {
+			fridgeType.getDeclaredId( java.util.Date.class );
+			fail( "expecting failure" );
+		}
+		catch ( IllegalArgumentException ignore ) {
+			// expected result
+		}
+		final SingularAttribute<? super Fridge, Long> id2 = fridgeType.getId( Long.class );
+		assertNotNull( id2 );
+
 		assertEquals( Fridge.class.getName(), fridgeType.getName() );
 		assertEquals( Long.class, fridgeType.getIdType().getJavaType() );
 		assertTrue( fridgeType.hasSingleIdAttribute() );



More information about the hibernate-commits mailing list