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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Dec 18 10:32:40 EST 2009


Author: steve.ebersole at jboss.com
Date: 2009-12-18 10:32:39 -0500 (Fri, 18 Dec 2009)
New Revision: 18268

Added:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ExpressionImplementor.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SelectionImplementor.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/TupleElementImplementor.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ValueConverter.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Address.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Alias.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Country.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/CreditCard.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Customer.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Info.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/LineItem.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Order.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Phone.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Spouse.java
Removed:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImplementor.java
Modified:
   core/trunk/core/src/main/java/org/hibernate/engine/query/NamedParameterDescriptor.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/AbstractTupleElement.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CompoundSelectionImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SelectionImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ComparisonPredicate.java
Log:
HHH-4698 - Better handling of JPA criteria expressions


Modified: core/trunk/core/src/main/java/org/hibernate/engine/query/NamedParameterDescriptor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/query/NamedParameterDescriptor.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/core/src/main/java/org/hibernate/engine/query/NamedParameterDescriptor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -35,7 +35,7 @@
  */
 public class NamedParameterDescriptor implements Serializable {
 	private final String name;
-	private final Type expectedType;
+	private Type expectedType;
 	private final int[] sourceLocations;
 	private final boolean jpaStyle;
 
@@ -61,4 +61,8 @@
 	public boolean isJpaStyle() {
 		return jpaStyle;
 	}
+
+	public void resetExpectedType(Type type) {
+		this.expectedType = type;
+	}
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -27,8 +27,8 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import javax.persistence.EntityNotFoundException;
 import javax.persistence.EntityTransaction;
 import javax.persistence.FlushModeType;
@@ -59,6 +59,7 @@
 
 import org.hibernate.*;
 import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.criteria.ValueConverter;
 import org.hibernate.ejb.transaction.JoinableCMTTransaction;
 import org.hibernate.ejb.util.ConfigurationHelper;
 import org.hibernate.ejb.criteria.CriteriaQueryCompiler;
@@ -66,6 +67,7 @@
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.proxy.HibernateProxy;
 import org.hibernate.transaction.TransactionFactory;
+import org.hibernate.transform.BasicTransformerAdapter;
 import org.hibernate.util.CollectionHelper;
 import org.hibernate.util.JTAHelper;
 
@@ -140,6 +142,45 @@
 		}
 	}
 
+	public <T> TypedQuery<T> createQuery(
+			String jpaqlString,
+			Class<T> resultClass,
+			Options options) {
+		try {
+			org.hibernate.Query hqlQuery = getSession().createQuery( jpaqlString );
+			if ( options.getConversions() != null ) {
+				hqlQuery.setResultTransformer( new ValueConversionResultTransformer(  options.getConversions() ) );
+			}
+			else {
+				options.getResultMetadataValidator().validate( hqlQuery.getReturnTypes() );
+			}
+			return new QueryImpl<T>( hqlQuery, this, options.getNamedParameterExplicitTypes() );
+		}
+		catch ( HibernateException he ) {
+			throw convert( he );
+		}
+	}
+
+	private static class ValueConversionResultTransformer extends BasicTransformerAdapter {
+		private List<ValueConverter.Conversion> conversions;
+
+		private ValueConversionResultTransformer(List<ValueConverter.Conversion> conversions) {
+			this.conversions = conversions;
+		}
+
+		@Override
+		public Object transformTuple(Object[] tuple, String[] aliases) {
+			Object[] result = new Object[ tuple.length ];
+			for ( int i = 0; i < tuple.length; i++ ) {
+				ValueConverter.Conversion conversion = conversions.get( i );
+				result[i] = conversion == null
+						? tuple[i]
+						: conversion.apply( tuple[i] );
+			}
+			return result.length == 1 ? result[0] : result;
+		}
+	}
+
 	private CriteriaQueryCompiler criteriaQueryCompiler;
 
 	public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -25,11 +25,16 @@
 
 import javax.persistence.PersistenceException;
 import javax.persistence.LockModeType;
+import javax.persistence.TypedQuery;
 
 import org.hibernate.HibernateException;
 import org.hibernate.StaleStateException;
 import org.hibernate.LockOptions;
+import org.hibernate.ejb.criteria.ValueConverter;
+import org.hibernate.transform.ResultTransformer;
+import org.hibernate.type.Type;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -108,4 +113,38 @@
 	 * @return the LockOptions
 	 */
 	public LockOptions getLockRequest(LockModeType lockModeType, Map<String, Object> properties);
+
+	public static interface Options {
+		public static interface ResultMetadataValidator {
+			public void validate(Type[] returnTypes);
+		}
+
+		/**
+		 * Get the conversions for the individual tuples in the query results.
+		 *
+		 * @return Value conversions to be applied to the JPA QL results
+		 */
+		public List<ValueConverter.Conversion> getConversions();
+
+		/**
+		 * Get the explicit parameter types.  Generally speaking these would apply to implicit named
+		 * parameters.
+		 *
+		 * @return The
+		 */
+		public Map<String,Class> getNamedParameterExplicitTypes();
+
+		public ResultMetadataValidator getResultMetadataValidator();
+	}
+
+	/**
+	 * Used during "compiling" a JPA criteria query.
+	 *
+	 * @param jpaqlString The criteria query rendered as a JPA QL string
+	 * @param resultClass The result type (the type expected in the result list)
+	 * @param options The options to use to build the query.
+	 * @param <T> The query type
+	 * @return The typed query
+	 */
+	public <T> TypedQuery<T> createQuery(String jpaqlString, Class<T> resultClass, Options options);
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -25,9 +25,11 @@
 
 import java.util.Calendar;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.NoResultException;
@@ -56,6 +58,7 @@
 import org.hibernate.engine.query.OrdinalParameterDescriptor;
 import org.hibernate.hql.QueryExecutionRequestException;
 import org.hibernate.impl.AbstractQueryImpl;
+import org.hibernate.type.TypeFactory;
 
 /**
  * Hibernate implementation of both the {@link Query} and {@link TypedQuery} contracts.
@@ -72,13 +75,20 @@
 	private Set<Parameter<?>> parameters;
 
 	public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) {
+		this( query, em, Collections.<String, Class>emptyMap() );
+	}
+
+	public QueryImpl(
+			org.hibernate.Query query,
+			AbstractEntityManagerImpl em,
+			Map<String,Class> namedParameterTypeRedefinitions) {
 		super( em );
 		this.query = query;
-		extractParameterInfo();
+		extractParameterInfo( namedParameterTypeRedefinitions );
 	}
 
 	@SuppressWarnings({ "unchecked", "RedundantCast" })
-	private void extractParameterInfo() {
+	private void extractParameterInfo(Map<String,Class> namedParameterTypeRedefinition) {
 		if ( ! AbstractQueryImpl.class.isInstance( query ) ) {
 			throw new IllegalStateException( "Unknown query type for parameter extraction" );
 		}
@@ -90,12 +100,16 @@
 		for ( String name : (Set<String>) queryImpl.getParameterMetadata().getNamedParameterNames() ) {
 			final NamedParameterDescriptor descriptor =
 					queryImpl.getParameterMetadata().getNamedParameterDescriptor( name );
-			final ParameterImpl parameter = new ParameterImpl(
-					name,
-					descriptor.getExpectedType() == null
-							? null
-							: descriptor.getExpectedType().getReturnedClass()
-			);
+			Class javaType = namedParameterTypeRedefinition.get( name );
+			if ( javaType != null ) {
+				descriptor.resetExpectedType(
+						TypeFactory.heuristicType( javaType.getName() )
+				);
+			}
+			else if ( descriptor.getExpectedType() != null ) {
+				javaType = descriptor.getExpectedType().getReturnedClass();
+			}
+			final ParameterImpl parameter = new ParameterImpl( name, javaType );
 			parameters.add( parameter );
 			if ( descriptor.isJpaStyle() ) {
 				if ( jpaPositionalIndices == null ) {

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -48,6 +48,7 @@
 import org.hibernate.ejb.criteria.expression.CollectionExpression;
 import org.hibernate.ejb.criteria.expression.CompoundSelectionImpl;
 import org.hibernate.ejb.criteria.expression.ConcatExpression;
+import org.hibernate.ejb.criteria.ExpressionImplementor;
 import org.hibernate.ejb.criteria.expression.ParameterExpressionImpl;
 import org.hibernate.ejb.criteria.expression.LiteralExpression;
 import org.hibernate.ejb.criteria.expression.NullifExpression;
@@ -1062,50 +1063,50 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<Long> toLong(Expression<? extends Number> expression) {
-		return expression.as( Long.class );
+	public ExpressionImplementor<Long> toLong(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asLong();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<Integer> toInteger(Expression<? extends Number> expression) {
-		return expression.as( Integer.class );
+	public ExpressionImplementor<Integer> toInteger(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asInteger();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<Float> toFloat(Expression<? extends Number> expression) {
-		return expression.as( Float.class );
+	public ExpressionImplementor<Float> toFloat(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asFloat();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<Double> toDouble(Expression<? extends Number> expression) {
-		return expression.as( Double.class );
+	public ExpressionImplementor<Double> toDouble(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asDouble();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<BigDecimal> toBigDecimal(Expression<? extends Number> expression) {
-		return expression.as( BigDecimal.class );
+	public ExpressionImplementor<BigDecimal> toBigDecimal(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asBigDecimal();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<BigInteger> toBigInteger(Expression<? extends Number> expression) {
-		return expression.as( BigInteger.class );
+	public ExpressionImplementor<BigInteger> toBigInteger(Expression<? extends Number> expression) {
+		return ( (ExpressionImplementor<? extends Number>) expression ).asBigInteger();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public Expression<String> toString(Expression<Character> characterExpression) {
-		return characterExpression.as( String.class );
+	public ExpressionImplementor<String> toString(Expression<Character> characterExpression) {
+		return ( (ExpressionImplementor<Character>) characterExpression ).asString();
 	}
 
 

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -55,6 +55,8 @@
  */
 public class CriteriaQueryCompiler {
 	public static interface ImplicitParameterBinding {
+		public String getParameterName();
+		public Class getJavaType();
 		public void bind(TypedQuery typedQuery);
 	}
 
@@ -70,6 +72,8 @@
 
 	public static interface RenderedCriteriaQuery {
 		public String getQueryString();
+		public List<ValueConverter.Conversion> getValueConversions();
+		public HibernateEntityManagerImplementor.Options.ResultMetadataValidator getResultMetadataValidator();
 	}
 
 	private final HibernateEntityManagerImplementor entityManager;
@@ -85,6 +89,7 @@
 		final Map<ParameterExpression<?>,String> explicitParameterMapping = new HashMap<ParameterExpression<?>,String>();
 		final Map<String,ParameterExpression<?>> explicitParameterNameMapping = new HashMap<String,ParameterExpression<?>>();
 		final List<ImplicitParameterBinding> implicitParameterBindings = new ArrayList<ImplicitParameterBinding>();
+		final Map<String,Class> implicitParameterTypes = new HashMap<String, Class>();
 
 		RenderingContext renderingContext = new RenderingContext() {
 			private int aliasCount = 0;
@@ -110,6 +115,10 @@
 
 			public void registerImplicitParameterBinding(ImplicitParameterBinding binding) {
 				implicitParameterBindings.add( binding );
+				implicitParameterTypes.put(
+						binding.getParameterName(),
+						binding.getJavaType()
+				);
 			}
 
 			public String getCastType(Class javaType) {
@@ -132,12 +141,26 @@
 			}
 		};
 
-		RenderedCriteriaQuery renderedCriteriaQuery = criteriaQueryImpl.render( renderingContext );
+		final RenderedCriteriaQuery renderedCriteriaQuery = criteriaQueryImpl.render( renderingContext );
 
 		TypedQuery<T> jpaqlQuery = entityManager.createQuery(
 				renderedCriteriaQuery.getQueryString(),
-				criteriaQuery.getResultType()
+				criteriaQuery.getResultType(),
+				new HibernateEntityManagerImplementor.Options() {
+					public List<ValueConverter.Conversion> getConversions() {
+						return renderedCriteriaQuery.getValueConversions();
+					}
+
+					public Map<String, Class> getNamedParameterExplicitTypes() {
+						return implicitParameterTypes;
+					}
+
+					public ResultMetadataValidator getResultMetadataValidator() {
+						return renderedCriteriaQuery.getResultMetadataValidator();
+					}
+				}
 		);
+
 		for ( ImplicitParameterBinding implicitParameterBinding : implicitParameterBindings ) {
 			implicitParameterBinding.bind( jpaqlQuery );
 		}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -38,6 +38,9 @@
 import javax.persistence.criteria.Subquery;
 import javax.persistence.metamodel.EntityType;
 
+import org.hibernate.ejb.HibernateEntityManagerImplementor;
+import org.hibernate.type.Type;
+
 /**
  * The Hibernate implementation of the JPA {@link CriteriaQuery} contract.  Mostly a set of delegation to its
  * internal {@link QueryStructure}.
@@ -350,6 +353,41 @@
 			public String getQueryString() {
 				return jpaqlQuery.toString();
 			}
+
+			@SuppressWarnings({ "unchecked" })
+			public List<ValueConverter.Conversion> getValueConversions() {
+				SelectionImplementor selection = (SelectionImplementor) queryStructure.getSelection();
+				return selection == null
+						? null
+						: selection.getConversions();
+			}
+
+			public HibernateEntityManagerImplementor.Options.ResultMetadataValidator getResultMetadataValidator() {
+				return new HibernateEntityManagerImplementor.Options.ResultMetadataValidator() {
+					public void validate(Type[] returnTypes) {
+						SelectionImplementor selection = (SelectionImplementor) queryStructure.getSelection();
+						if ( selection != null ) {
+							if ( selection.isCompoundSelection() ) {
+								if ( returnTypes.length != selection.getCompoundSelectionItems().size() ) {
+									throw new IllegalStateException(
+											"Number of return values [" + returnTypes.length +
+													"] did not match expected [" +
+													selection.getCompoundSelectionItems().size() + "]"
+									);
+								}
+							}
+							else {
+								if ( returnTypes.length > 1 ) {
+									throw new IllegalStateException(
+											"Number of return values [" + returnTypes.length +
+													"] did not match expected [1]"
+									);
+								}
+							}
+						}
+					}
+				};
+			}
 		};
 	}
 }

Copied: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ExpressionImplementor.java (from rev 18253, core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImplementor.java)
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ExpressionImplementor.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ExpressionImplementor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,84 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * 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
+ * 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.criteria;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import javax.persistence.criteria.Expression;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public interface ExpressionImplementor<T> extends SelectionImplementor<T>, Expression<T>, Renderable {
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toLong}
+	 *
+	 * @return <tt>this</tt> but as a long
+	 */
+	public ExpressionImplementor<Long> asLong();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toInteger}
+	 *
+	 * @return <tt>this</tt> but as an integer
+	 */
+	public ExpressionImplementor<Integer> asInteger();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toFloat}
+	 *
+	 * @return <tt>this</tt> but as a float
+	 */
+	public ExpressionImplementor<Float> asFloat();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toDouble}
+	 *
+	 * @return <tt>this</tt> but as a double
+	 */
+	public ExpressionImplementor<Double> asDouble();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toBigDecimal}
+	 *
+	 * @return <tt>this</tt> but as a {@link BigDecimal}
+	 */
+	public ExpressionImplementor<BigDecimal> asBigDecimal();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toBigInteger}
+	 *
+	 * @return <tt>this</tt> but as a {@link BigInteger}
+	 */
+	public ExpressionImplementor<BigInteger> asBigInteger();
+
+	/**
+	 * See {@link javax.persistence.criteria.CriteriaBuilder#toString}
+	 *
+	 * @return <tt>this</tt> but as a string
+	 */
+	public ExpressionImplementor<String> asString();
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SelectionImplementor.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SelectionImplementor.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SelectionImplementor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,36 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.criteria;
+
+import java.util.List;
+import javax.persistence.criteria.Selection;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public interface SelectionImplementor<X> extends TupleElementImplementor<X>, Selection<X>  {
+	public List<ValueConverter.Conversion> getConversions();
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/TupleElementImplementor.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/TupleElementImplementor.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/TupleElementImplementor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,35 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.criteria;
+
+import javax.persistence.TupleElement;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public interface TupleElementImplementor<X> extends TupleElement<X> {
+	public ValueConverter.Conversion<X> getConversion();
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ValueConverter.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ValueConverter.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ValueConverter.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,255 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.criteria;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * Helper for generically converting a values into another type.
+ *
+ * @author Steve Ebersole
+ */
+public class ValueConverter {
+	private ValueConverter() {
+	}
+
+	public static interface Conversion<T> {
+		public T apply(Object value);
+	}
+
+	public static class ByteConversion implements Conversion<Byte> {
+		public static final ByteConversion INSTANCE = new ByteConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Byte apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Byte.valueOf( ( (Number) value ).byteValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Byte.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Byte.class );
+		}
+	}
+
+	public static class ShortConversion implements Conversion<Short> {
+		public static final ShortConversion INSTANCE = new ShortConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Short apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Short.valueOf( ( (Number) value ).shortValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Short.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Short.class );
+		}
+	}
+
+	public static class IntegerConversion implements Conversion<Integer> {
+		public static final IntegerConversion INSTANCE = new IntegerConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Integer apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Integer.valueOf( ( (Number) value ).intValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Integer.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Integer.class );
+		}
+	}
+
+	public static class LongConversion implements Conversion<Long> {
+		public static final LongConversion INSTANCE = new LongConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Long apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Long.valueOf( ( (Number) value ).longValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Long.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Long.class );
+		}
+	}
+
+	public static class FloatConversion implements Conversion<Float> {
+		public static final FloatConversion INSTANCE = new FloatConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Float apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Float.valueOf( ( (Number) value ).floatValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Float.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Float.class );
+		}
+	}
+
+	public static class DoubleConversion implements Conversion<Double> {
+		public static final DoubleConversion INSTANCE = new DoubleConversion();
+		@SuppressWarnings({ "UnnecessaryBoxing" })
+		public Double apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return Double.valueOf( ( (Number) value ).doubleValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return Double.valueOf( ( (String) value ) );
+			}
+			throw unknownConversion( value, Double.class );
+		}
+	}
+
+	public static class BigIntegerConversion implements Conversion<BigInteger> {
+		public static final BigIntegerConversion INSTANCE = new BigIntegerConversion();
+		public BigInteger apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( Number.class.isInstance( value ) ) {
+				return BigInteger.valueOf( ( (Number) value ).longValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return new BigInteger( (String) value );
+			}
+			throw unknownConversion( value, BigInteger.class );
+		}
+	}
+
+	public static class BigDecimalConversion implements Conversion<BigDecimal> {
+		public static final BigDecimalConversion INSTANCE = new BigDecimalConversion();
+		public BigDecimal apply(Object value) {
+			if ( value == null ) {
+				return null;
+			}
+			if ( BigInteger.class.isInstance( value ) ) {
+				return new BigDecimal( (BigInteger) value );
+			}
+			else if ( Number.class.isInstance( value ) ) {
+				return BigDecimal.valueOf( ( (Number) value ).doubleValue() );
+			}
+			else if ( String.class.isInstance( value ) ) {
+				return new BigDecimal( (String) value );
+			}
+			throw unknownConversion( value, BigDecimal.class );
+		}
+	}
+
+	public static class StringConversion implements Conversion<String> {
+		public static final StringConversion INSTANCE = new StringConversion();
+		public String apply(Object value) {
+			return value == null ? null : value.toString();
+		}
+	}
+
+	private static IllegalArgumentException unknownConversion(Object value, Class type) {
+		return new IllegalArgumentException(
+				"Unaware how to convert value [" + value + "] to requested type [" + type.getName() + "]"
+		);
+	}
+
+	/**
+	 * Convert the given value into the specified target type.
+	 *
+	 * @param value The value to convert
+	 * @param targetType The type to which it should be converted
+	 *
+	 * @return The converted value.
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public static <T> T convert(Object value, Class<T> targetType) {
+		if ( value == null ) {
+			return null;
+		}
+		if ( targetType.equals( value.getClass() ) ) {
+			return (T) value;
+		}
+
+		Conversion<T> conversion = determineAppropriateConversion( targetType );
+		if ( conversion == null ) {
+			throw unknownConversion( value, targetType );
+		}
+		return conversion.apply( value );
+	}
+
+	/**
+	 * Determine the appropriate {@link Conversion} strategy for converting a value
+	 * to the given target type
+	 *
+	 * @param targetType The target type (to which we want to convert values).
+	 * @param <T> parameterized type for the target type.
+	 * @return The conversion
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public static <T> Conversion<T> determineAppropriateConversion(Class<T> targetType) {
+		if ( String.class.equals( targetType ) ) {
+			return (Conversion<T>) StringConversion.INSTANCE;
+		}
+		if ( Byte.class.equals( targetType ) ) {
+			return (Conversion<T>) ByteConversion.INSTANCE;
+		}
+		if ( Short.class.equals( targetType ) ) {
+			return (Conversion<T>) ShortConversion.INSTANCE;
+		}
+		if ( Integer.class.equals( targetType ) ) {
+			return (Conversion<T>) IntegerConversion.INSTANCE;
+		}
+		if ( Long.class.equals( targetType ) ) {
+			return (Conversion<T>) LongConversion.INSTANCE;
+		}
+		if ( Float.class.equals( targetType ) ) {
+			return (Conversion<T>) FloatConversion.INSTANCE;
+		}
+		if ( Double.class.equals( targetType ) ) {
+			return (Conversion<T>) DoubleConversion.INSTANCE;
+		}
+		if ( BigInteger.class.equals( targetType ) ) {
+			return (Conversion<T>) BigIntegerConversion.INSTANCE;
+		}
+		if ( BigDecimal.class.equals( targetType ) ) {
+			return (Conversion<T>) BigDecimalConversion.INSTANCE;
+		}
+		return null;
+	}
+}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/AbstractTupleElement.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/AbstractTupleElement.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/AbstractTupleElement.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -23,22 +23,27 @@
  */
 package org.hibernate.ejb.criteria.expression;
 
-import javax.persistence.TupleElement;
-
 import org.hibernate.ejb.criteria.AbstractNode;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
+import org.hibernate.ejb.criteria.TupleElementImplementor;
+import org.hibernate.ejb.criteria.ValueConverter;
 
 /**
  * TODO : javadoc
  *
  * @author Steve Ebersole
  */
-public abstract class AbstractTupleElement<X> extends AbstractNode implements TupleElement<X> {
-	private final Class<X> javaType;
+public abstract class AbstractTupleElement<X>
+		extends AbstractNode
+		implements TupleElementImplementor<X> {
+	private final Class originalJavaType;
+	private Class<X> javaType;
 	private String alias;
+	private ValueConverter.Conversion<X> conversion;
 
 	protected AbstractTupleElement(CriteriaBuilderImpl criteriaBuilder, Class<X> javaType) {
 		super( criteriaBuilder );
+		this.originalJavaType = javaType;
 		this.javaType = javaType;
 	}
 
@@ -49,9 +54,29 @@
 		return javaType;
 	}
 
+	@SuppressWarnings({ "unchecked" })
+	protected void resetJavaType(Class targetType) {
+		this.javaType = targetType;
+//		this.conversion = javaType.equals( originalJavaType )
+//				? null
+//				: ValueConverter.determineAppropriateConversion( javaType );
+		this.conversion = ValueConverter.determineAppropriateConversion( javaType );
+	}
+
+	protected void forceConversion(ValueConverter.Conversion<X> conversion) {
+		this.conversion = conversion;
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
+	public ValueConverter.Conversion<X> getConversion() {
+		return conversion;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
 	public String getAlias() {
 		return alias;
 	}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CompoundSelectionImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CompoundSelectionImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CompoundSelectionImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -23,6 +23,7 @@
  */
 package org.hibernate.ejb.criteria.expression;
 
+import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.Tuple;
 import javax.persistence.criteria.CompoundSelection;
@@ -32,6 +33,8 @@
 import org.hibernate.ejb.criteria.ParameterRegistry;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
 import org.hibernate.ejb.criteria.Renderable;
+import org.hibernate.ejb.criteria.TupleElementImplementor;
+import org.hibernate.ejb.criteria.ValueConverter;
 
 /**
  * The Hibernate implementation of the JPA {@link CompoundSelection}
@@ -62,6 +65,21 @@
 		return selectionItems;
 	}
 
+	@Override
+	public List<ValueConverter.Conversion> getConversions() {
+		if ( isConstructor ) {
+			return null;
+		}
+		boolean foundConversions = false;
+		ArrayList<ValueConverter.Conversion> conversions = new ArrayList<ValueConverter.Conversion>();
+		for ( Selection selection : getCompoundSelectionItems() ) {
+			ValueConverter.Conversion conversion = ( (TupleElementImplementor) selection ).getConversion();
+			conversions.add( conversion );
+			foundConversions = foundConversions || conversion != null;
+		}
+		return foundConversions ? null : conversions;
+	}
+
 	public void registerParameters(ParameterRegistry registry) {
 		for ( Selection selectionItem : getCompoundSelectionItems() ) {
 			Helper.possibleParameter(selectionItem, registry);

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -23,11 +23,14 @@
  */
 package org.hibernate.ejb.criteria.expression;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.Collection;
 import javax.persistence.criteria.Expression;
 import javax.persistence.criteria.Predicate;
 
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
+import org.hibernate.ejb.criteria.ExpressionImplementor;
 import org.hibernate.ejb.criteria.expression.function.CastFunction;
 
 /**
@@ -93,4 +96,67 @@
 	public Predicate in(Expression<Collection<?>> values) {
 		return queryBuilder().in( this, values );
 	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<Long> asLong() {
+		resetJavaType( Long.class );
+		return (ExpressionImplementor<Long>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<Integer> asInteger() {
+		resetJavaType( Integer.class );
+		return (ExpressionImplementor<Integer>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<Float> asFloat() {
+		resetJavaType( Float.class );
+		return (ExpressionImplementor<Float>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<Double> asDouble() {
+		resetJavaType( Double.class );
+		return (ExpressionImplementor<Double>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<BigDecimal> asBigDecimal() {
+		resetJavaType( BigDecimal.class );
+		return (ExpressionImplementor<BigDecimal>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<BigInteger> asBigInteger() {
+		resetJavaType( BigInteger.class );
+		return (ExpressionImplementor<BigInteger>) this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public ExpressionImplementor<String> asString() {
+		resetJavaType( String.class );
+		return (ExpressionImplementor<String>) this;
+	}
 }

Deleted: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImplementor.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImplementor.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ExpressionImplementor.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -1,36 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * 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
- * 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.criteria.expression;
-
-import javax.persistence.criteria.Expression;
-
-import org.hibernate.ejb.criteria.Renderable;
-
-/**
- * TODO : javadoc
- *
- * @author Steve Ebersole
- */
-public interface ExpressionImplementor<T> extends Expression<T>, Renderable {
-}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -25,6 +25,7 @@
 
 import javax.persistence.TypedQuery;
 
+import org.hibernate.ejb.criteria.ValueConverter;
 import org.hibernate.ejb.criteria.ParameterRegistry;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
 import org.hibernate.ejb.criteria.CriteriaQueryCompiler;
@@ -35,7 +36,7 @@
  * @author Steve Ebersole
  */
 public class LiteralExpression<T> extends ExpressionImpl<T> {
-	private final T literal;
+	private Object literal;
 
 	@SuppressWarnings({ "unchecked" })
 	public LiteralExpression(CriteriaBuilderImpl criteriaBuilder, T literal) {
@@ -51,18 +52,27 @@
 		this.literal = literal;
 	}
 
+	@SuppressWarnings({ "unchecked" })
 	public T getLiteral() {
-		return literal;
+		return (T) literal;
 	}
 
 	public void registerParameters(ParameterRegistry registry) {
-		// nothign to do
+		// nothing to do
 	}
 
 	public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
 		final String parameterName = renderingContext.generateParameterName();
 		renderingContext.registerImplicitParameterBinding(
 				new CriteriaQueryCompiler.ImplicitParameterBinding() {
+					public String getParameterName() {
+						return parameterName;
+					}
+
+					public Class getJavaType() {
+						return LiteralExpression.this.getJavaType();
+					}
+
 					public void bind(TypedQuery typedQuery) {
 						typedQuery.setParameter( parameterName, getLiteral() );
 					}
@@ -74,4 +84,19 @@
 	public String renderProjection(CriteriaQueryCompiler.RenderingContext renderingContext) {
 		return render( renderingContext );
 	}
+
+	@Override
+	@SuppressWarnings({ "unchecked" })
+	protected void resetJavaType(Class targetType) {
+		super.resetJavaType( targetType );
+		ValueConverter.Conversion conversion = getConversion();
+		if ( conversion == null ) {
+			conversion = ValueConverter.determineAppropriateConversion( targetType );
+			forceConversion( conversion );
+		}
+
+		if ( conversion != null ) {
+			literal = conversion.apply( literal );
+		}
+	}
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SelectionImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SelectionImpl.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SelectionImpl.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -23,11 +23,14 @@
  */
 package org.hibernate.ejb.criteria.expression;
 
+import java.util.Collections;
 import java.util.List;
 import javax.persistence.criteria.Selection;
 
 import org.hibernate.ejb.criteria.ParameterContainer;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
+import org.hibernate.ejb.criteria.SelectionImplementor;
+import org.hibernate.ejb.criteria.ValueConverter;
 
 /**
  * The Hibernate implementation of the JPA {@link Selection}
@@ -37,7 +40,7 @@
  */
 public abstract class SelectionImpl<X>
 		extends AbstractTupleElement<X>
-		implements Selection<X>, ParameterContainer {
+		implements SelectionImplementor<X>, ParameterContainer {
 	public SelectionImpl(CriteriaBuilderImpl criteriaBuilder, Class<X> javaType) {
 		super( criteriaBuilder, javaType );
 	}
@@ -51,6 +54,12 @@
 		return false;
 	}
 
+	public List<ValueConverter.Conversion> getConversions() {
+		return getConversion() == null
+				? null
+				: Collections.singletonList( (ValueConverter.Conversion) getConversion() );
+	}
+
 	public List<Selection<?>> getCompoundSelectionItems() {
 		throw new IllegalStateException( "Not a compund selection" );
 	}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ComparisonPredicate.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ComparisonPredicate.java	2009-12-18 12:01:33 UTC (rev 18267)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ComparisonPredicate.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -25,6 +25,7 @@
 
 import javax.persistence.criteria.Expression;
 
+import org.hibernate.ejb.criteria.ValueConverter;
 import org.hibernate.ejb.criteria.ParameterRegistry;
 import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
 import org.hibernate.ejb.criteria.CriteriaQueryCompiler;
@@ -62,9 +63,31 @@
 		super( criteriaBuilder );
 		this.comparisonOperator = comparisonOperator;
 		this.leftHandSide = leftHandSide;
-		this.rightHandSide = new LiteralExpression( criteriaBuilder, rightHandSide );
+		if ( Number.class.isAssignableFrom( leftHandSide.getJavaType() ) ) {
+			this.rightHandSide = new LiteralExpression(
+					criteriaBuilder,
+					ValueConverter.convert( rightHandSide, (Class<Number>) leftHandSide.getJavaType() )
+			);
+		}
+		else {
+			this.rightHandSide = new LiteralExpression( criteriaBuilder, rightHandSide );
+		}
 	}
 
+	public <N extends Number> ComparisonPredicate(
+			CriteriaBuilderImpl criteriaBuilder,
+			ComparisonOperator comparisonOperator,
+			Expression<N> leftHandSide,
+			Number rightHandSide) {
+		super( criteriaBuilder );
+		this.comparisonOperator = comparisonOperator;
+		this.leftHandSide = leftHandSide;
+		this.rightHandSide = new LiteralExpression<N>( 
+				criteriaBuilder,
+				ValueConverter.convert( rightHandSide, leftHandSide.getJavaType() )
+		);
+	}
+
 	public ComparisonOperator getComparisonOperator() {
 		return isNegated()
 				? comparisonOperator.negated()

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,190 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.criteria;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.EntityType;
+
+import org.hibernate.ejb.criteria.predicate.ComparisonPredicate;
+import org.hibernate.ejb.metamodel.Address;
+import org.hibernate.ejb.metamodel.Alias;
+import org.hibernate.ejb.metamodel.Country;
+import org.hibernate.ejb.metamodel.CreditCard;
+import org.hibernate.ejb.metamodel.Customer;
+import org.hibernate.ejb.metamodel.Info;
+import org.hibernate.ejb.metamodel.LineItem;
+import org.hibernate.ejb.metamodel.Order;
+import org.hibernate.ejb.metamodel.MetamodelImpl;
+import org.hibernate.ejb.metamodel.Phone;
+import org.hibernate.ejb.metamodel.Product;
+import org.hibernate.ejb.metamodel.ShelfLife;
+import org.hibernate.ejb.metamodel.Spouse;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class QueryBuilderTest extends TestCase {
+	@Override
+	public Class[] getAnnotatedClasses() {
+		return new Class[] {
+				Address.class,
+				Alias.class,
+				Country.class,
+				CreditCard.class,
+				Customer.class,
+				Info.class,
+				LineItem.class,
+				Order.class,
+				Phone.class,
+				Product.class,
+				ShelfLife.class,
+				Spouse.class
+		};
+	}
+
+	public void testEqualityComparisonLiteralConversion() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+
+		CriteriaBuilderImpl cb = (CriteriaBuilderImpl) em.getCriteriaBuilder();
+		MetamodelImpl mm = (MetamodelImpl) em.getMetamodel();
+
+        CriteriaQuery<Integer> cquery = cb.createQuery( Integer.class );
+		Root<Product> product = cquery.from( Product.class );
+		EntityType<Product> Product_ = mm.entity( Product.class );
+
+		cquery.select(
+				cb.toInteger(
+						product.get(
+								Product_.getSingularAttribute("quantity", Integer.class))
+				)
+		);
+
+		ComparisonPredicate predicate = (ComparisonPredicate) cb.equal(
+				product.get( Product_.getSingularAttribute( "partNumber", Long.class ) ),
+				373767373
+		);
+		assertEquals( Long.class, predicate.getRightHandOperand().getJavaType() );
+		cquery.where( predicate );
+		em.createQuery( cquery ).getResultList();
+
+		predicate = (ComparisonPredicate) cb.ge(
+				cb.length( product.get( Product_.getSingularAttribute( "name", String.class ) ) ),
+				4L
+		);
+		assertEquals( Integer.class, predicate.getRightHandOperand().getJavaType() );
+		cquery.where( predicate );
+		em.createQuery( cquery ).getResultList();
+
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public void testTypeConversion() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaBuilderImpl cb = (CriteriaBuilderImpl) em.getCriteriaBuilder();
+		MetamodelImpl mm = (MetamodelImpl) em.getMetamodel();
+		EntityType<Product> Product_ = mm.entity( Product.class );
+
+		// toFloat
+        CriteriaQuery<Float> floatQuery = cb.createQuery( Float.class );
+		Root<Product> product = floatQuery.from( Product.class );
+		floatQuery.select(
+				cb.toFloat(
+						product.get(Product_.getSingularAttribute("quantity", Integer.class))
+				)
+		);
+		em.createQuery( floatQuery ).getResultList();
+
+		// toDouble
+        CriteriaQuery<Double> doubleQuery = cb.createQuery(Double.class);
+		product = doubleQuery.from( Product.class );
+		doubleQuery.select(
+				cb.toDouble(
+						product.get(Product_.getSingularAttribute("quantity", Integer.class))
+				)
+		);
+		em.createQuery( doubleQuery ).getResultList();
+
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public void testConstructor() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaBuilderImpl cb = (CriteriaBuilderImpl) em.getCriteriaBuilder();
+		MetamodelImpl mm = (MetamodelImpl) em.getMetamodel();
+
+        CriteriaQuery<Customer> cquery = cb.createQuery(Customer.class);
+		Root<Customer> customer = cquery.from(Customer.class);
+		EntityType<Customer> Customer_ = customer.getModel();
+
+		cquery.select(
+				cb.construct(
+						Customer.class,
+						customer.get(Customer_.getSingularAttribute("id", String.class)),
+						customer.get(Customer_.getSingularAttribute("name", String.class))
+				)
+		);
+		TypedQuery<Customer> tq = em.createQuery(cquery);
+		tq.getResultList();
+
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public void testDateTimeFunctions() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaBuilderImpl cb = (CriteriaBuilderImpl) em.getCriteriaBuilder();
+		MetamodelImpl mm = (MetamodelImpl) em.getMetamodel();
+
+        CriteriaQuery<java.sql.Date> dateQuery = cb.createQuery(java.sql.Date.class);
+		dateQuery.from( Customer.class );
+		dateQuery.select( cb.currentDate() );
+		em.createQuery( dateQuery ).getResultList();
+
+        CriteriaQuery<java.sql.Time> timeQuery = cb.createQuery(java.sql.Time.class);
+		timeQuery.from( Customer.class );
+		timeQuery.select( cb.currentTime() );
+		em.createQuery( timeQuery ).getResultList();
+
+        CriteriaQuery<java.sql.Timestamp> tsQuery = cb.createQuery(java.sql.Timestamp.class);
+		tsQuery.from( Customer.class );
+		tsQuery.select( cb.currentTimestamp() );
+		em.createQuery( tsQuery ).getResultList();
+
+		em.getTransaction().commit();
+		em.close();
+	}
+}

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Address.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Address.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Address.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,124 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "ADDRESS")
+public class Address implements java.io.Serializable {
+	private String id;
+	private String street;
+	private String city;
+	private String state;
+	private String zip;
+	private Collection<Phone> phones = new java.util.ArrayList<Phone>();
+
+	public Address() {
+	}
+
+	public Address(String id, String street, String city, String state, String zip) {
+		this.id = id;
+		this.street = street;
+		this.city = city;
+		this.state = state;
+		this.zip = zip;
+	}
+
+	public Address(String id, String street, String city, String state, String zip,
+				   Collection<Phone> phones) {
+		this.id = id;
+		this.street = street;
+		this.city = city;
+		this.state = state;
+		this.zip = zip;
+		this.phones = phones;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@Column(name = "STREET")
+	public String getStreet() {
+		return street;
+	}
+
+	public void setStreet(String street) {
+		this.street = street;
+	}
+
+	@Column(name = "CITY")
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	@Column(name = "STATE")
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	@Column(name = "ZIP")
+	public String getZip() {
+		return zip;
+	}
+
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+
+	@OneToMany(cascade = CascadeType.ALL, mappedBy = "address")
+	public Collection<Phone> getPhones() {
+		return phones;
+	}
+
+	public void setPhones(Collection<Phone> phones) {
+		this.phones = phones;
+	}
+}
\ No newline at end of file

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Alias.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Alias.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Alias.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,123 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "ALIAS_TABLE")
+public class Alias implements java.io.Serializable {
+	private String id;
+	private String alias;
+	private Customer customerNoop;
+	private Collection<Customer> customersNoop = new java.util.ArrayList<Customer>();
+	private Collection<Customer> customers = new java.util.ArrayList<Customer>();
+
+	public Alias() {
+	}
+
+	public Alias(String id, String alias) {
+		this.id = id;
+		this.alias = alias;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@Column(name = "ALIAS")
+	public String getAlias() {
+		return alias;
+	}
+
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK1_FOR_CUSTOMER_TABLE", insertable = false, updatable = false)
+	public Customer getCustomerNoop() {
+		return customerNoop;
+	}
+
+	public void setCustomerNoop(Customer customerNoop) {
+		this.customerNoop = customerNoop;
+	}
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@JoinTable(name = "FKS_ANOOP_CNOOP",
+			joinColumns =
+			@JoinColumn(
+					name = "FK2_FOR_ALIAS_TABLE", referencedColumnName = "ID"),
+			inverseJoinColumns =
+			@JoinColumn(
+					name = "FK8_FOR_CUSTOMER_TABLE", referencedColumnName = "ID")
+	)
+	public Collection<Customer> getCustomersNoop() {
+		return customersNoop;
+	}
+
+	public void setCustomersNoop(Collection<Customer> customersNoop) {
+		this.customersNoop = customersNoop;
+
+	}
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@JoinTable(name = "FKS_ALIAS_CUSTOMER",
+			joinColumns =
+			@JoinColumn(
+					name = "FK_FOR_ALIAS_TABLE", referencedColumnName = "ID"),
+			inverseJoinColumns =
+			@JoinColumn(
+					name = "FK_FOR_CUSTOMER_TABLE", referencedColumnName = "ID")
+	)
+	public Collection<Customer> getCustomers() {
+		return customers;
+	}
+
+	public void setCustomers(Collection<Customer> customers) {
+		this.customers = customers;
+	}
+
+}

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Country.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Country.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Country.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,65 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.Basic;
+import javax.persistence.Embeddable;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Embeddable
+public class Country implements java.io.Serializable {
+	private String country;
+	private String code;
+
+	public Country() {
+	}
+
+	public Country(String v1, String v2) {
+		country = v1;
+		code = v2;
+	}
+
+	@Basic
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String v) {
+		country = v;
+	}
+
+	@Basic
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String v) {
+		code = v;
+	}
+}
+

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/CreditCard.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/CreditCard.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/CreditCard.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,153 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "CREDITCARD_TABLE")
+public class CreditCard implements java.io.Serializable {
+	private String id;
+	private String number;
+	private String type;
+	private String expires;
+	private boolean approved;
+	private double balance;
+	private Order order;
+	private Customer customer;
+
+	public CreditCard() {
+	}
+
+	public CreditCard(
+			String v1, String v2, String v3, String v4,
+			boolean v5, double v6, Order v7, Customer v8) {
+		id = v1;
+		number = v2;
+		type = v3;
+		expires = v4;
+		approved = v5;
+		balance = v6;
+		order = v7;
+		customer = v8;
+	}
+
+	public CreditCard(
+			String v1, String v2, String v3, String v4,
+			boolean v5, double v6) {
+		id = v1;
+		number = v2;
+		type = v3;
+		expires = v4;
+		approved = v5;
+		balance = v6;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		id = v;
+	}
+
+	@Column(name = "CREDITCARD_NUMBER")
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String v) {
+		number = v;
+	}
+
+	@Column(name = "TYPE")
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String v) {
+		type = v;
+	}
+
+	@Column(name = "EXPIRES")
+	public String getExpires() {
+		return expires;
+	}
+
+	public void setExpires(String v) {
+		expires = v;
+	}
+
+	@Column(name = "APPROVED")
+	public boolean getApproved() {
+		return approved;
+	}
+
+	public void setApproved(boolean v) {
+		approved = v;
+	}
+
+	@Column(name = "BALANCE")
+	public double getBalance() {
+		return balance;
+	}
+
+	public void setBalance(double v) {
+		balance = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK_FOR_ORDER_TABLE")
+	public Order getOrder() {
+		return order;
+	}
+
+	public void setOrder(Order v) {
+		order = v;
+	}
+
+	@ManyToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK3_FOR_CUSTOMER_TABLE")
+	public Customer getCustomer() {
+		return customer;
+	}
+
+	public void setCustomer(Customer v) {
+		customer = v;
+	}
+}

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Customer.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Customer.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Customer.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,172 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "CUSTOMER_TABLE")
+public class Customer implements java.io.Serializable {
+	private String id;
+	private String name;
+	private Address home;
+	private Address work;
+	private Country country;
+	private Spouse spouse;
+	private Collection<CreditCard> creditCards = new java.util.ArrayList<CreditCard>();
+	private Collection<Order> orders = new java.util.ArrayList<Order>();
+	private Collection<Alias> aliases = new java.util.ArrayList<Alias>();
+	private Collection<Alias> aliasesNoop = new java.util.ArrayList<Alias>();
+
+	public Customer() {
+	}
+
+	public Customer(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public Customer(String id, String name, Country country) {
+		this.id = id;
+		this.name = name;
+		this.country = country;
+	}
+
+	public Customer(String id, String name, Address home,
+					Address work, Country country) {
+		this.id = id;
+		this.name = name;
+		this.home = home;
+		this.work = work;
+		this.country = country;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		this.id = v;
+	}
+
+	@Column(name = "NAME")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String v) {
+		this.name = v;
+	}
+
+	@Embedded
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country v) {
+		this.country = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK6_FOR_CUSTOMER_TABLE")
+	public Address getHome() {
+		return home;
+	}
+
+	public void setHome(Address v) {
+		this.home = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK5_FOR_CUSTOMER_TABLE")
+	public Address getWork() {
+		return work;
+	}
+
+	public void setWork(Address v) {
+		this.work = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL, mappedBy = "customer")
+	public Spouse getSpouse() {
+		return spouse;
+	}
+
+	public void setSpouse(Spouse v) {
+		this.spouse = v;
+	}
+
+	@OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
+	public Collection<CreditCard> getCreditCards() {
+		return creditCards;
+	}
+
+	public void setCreditCards(Collection<CreditCard> v) {
+		this.creditCards = v;
+	}
+
+	@OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
+	public Collection<Order> getOrders() {
+		return orders;
+	}
+
+	public void setOrders(Collection<Order> v) {
+		this.orders = v;
+	}
+
+	@ManyToMany(cascade = CascadeType.ALL, mappedBy = "customers")
+	public Collection<Alias> getAliases() {
+		return aliases;
+	}
+
+	public void setAliases(Collection<Alias> v) {
+		this.aliases = v;
+	}
+
+	@ManyToMany(cascade = CascadeType.ALL, mappedBy = "customersNoop")
+	public Collection<Alias> getAliasesNoop() {
+		return aliasesNoop;
+	}
+
+	public void setAliasesNoop(Collection<Alias> v) {
+		this.aliasesNoop = v;
+	}
+}
\ No newline at end of file

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Info.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Info.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Info.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,124 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "INFO_TABLE")
+public class Info implements java.io.Serializable {
+	private String id;
+	private String street;
+	private String city;
+	private String state;
+	private String zip;
+	private Spouse spouse;
+
+	public Info() {
+	}
+
+	public Info(String v1, String v2, String v3, String v4, String v5) {
+		id = v1;
+		street = v2;
+		city = v3;
+		state = v4;
+		zip = v5;
+	}
+
+	public Info(
+			String v1, String v2, String v3, String v4,
+			String v5, Spouse v6) {
+		id = v1;
+		street = v2;
+		city = v3;
+		state = v4;
+		zip = v5;
+		spouse = v6;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		id = v;
+	}
+
+	@Column(name = "INFOSTREET")
+	public String getStreet() {
+		return street;
+	}
+
+	public void setStreet(String v) {
+		street = v;
+	}
+
+	@Column(name = "INFOSTATE")
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String v) {
+		state = v;
+	}
+
+	@Column(name = "INFOCITY")
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String v) {
+		city = v;
+	}
+
+	@Column(name = "INFOZIP")
+	public String getZip() {
+		return zip;
+	}
+
+	public void setZip(String v) {
+		zip = v;
+	}
+
+	@OneToOne(mappedBy = "info")
+	public Spouse getSpouse() {
+		return spouse;
+	}
+
+	public void setSpouse(Spouse v) {
+		this.spouse = v;
+	}
+
+}

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/LineItem.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/LineItem.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/LineItem.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,99 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "LINEITEM_TABLE")
+public class LineItem implements java.io.Serializable {
+	private String id;
+	private int quantity;
+	private Order order;
+	private Product product;
+
+	public LineItem() {
+	}
+
+	public LineItem(String v1, int v2, Order v3, Product v4) {
+		id = v1;
+		quantity = v2;
+		order = v3;
+		product = v4;
+	}
+
+	public LineItem(String v1, int v2) {
+		id = v1;
+		quantity = v2;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		id = v;
+	}
+
+	@Column(name = "QUANTITY")
+	public int getQuantity() {
+		return quantity;
+	}
+
+	public void setQuantity(int v) {
+		quantity = v;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "FK1_FOR_ORDER_TABLE")
+	public Order getOrder() {
+		return order;
+	}
+
+	public void setOrder(Order v) {
+		order = v;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "FK_FOR_PRODUCT_TABLE")
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product v) {
+		product = v;
+	}
+}
\ No newline at end of file

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Order.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Order.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Order.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,141 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "ORDER_TABLE")
+public class Order implements java.io.Serializable {
+	private String id;
+	private double totalPrice;
+	private Customer customer;
+	private CreditCard creditCard;
+	private LineItem sampleLineItem;
+	private Collection<LineItem> lineItems = new java.util.ArrayList<LineItem>();
+
+	public Order() {
+	}
+
+	public Order(String id, double totalPrice) {
+		this.id = id;
+		this.totalPrice = totalPrice;
+	}
+
+	public Order(String id, Customer customer) {
+		this.id = id;
+		this.customer = customer;
+	}
+
+	public Order(String id) {
+		this.id = id;
+	}
+
+	//====================================================================
+	// getters and setters for State fields
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@Column(name = "TOTALPRICE")
+	public double getTotalPrice() {
+		return totalPrice;
+	}
+
+	public void setTotalPrice(double price) {
+		this.totalPrice = price;
+	}
+
+	//====================================================================
+	// getters and setters for Association fields
+
+	// MANYx1
+
+	@ManyToOne
+	@JoinColumn(
+			name = "FK4_FOR_CUSTOMER_TABLE")
+	public Customer getCustomer() {
+		return customer;
+	}
+
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+
+	//1x1
+
+	@OneToOne(mappedBy = "order")
+	public CreditCard getCreditCard() {
+		return creditCard;
+	}
+
+	public void setCreditCard(CreditCard cc) {
+		this.creditCard = cc;
+	}
+
+	// 1x1
+
+	@OneToOne(cascade = CascadeType.REMOVE)
+	@JoinColumn(
+			name = "FK0_FOR_LINEITEM_TABLE")
+	public LineItem getSampleLineItem() {
+		return sampleLineItem;
+	}
+
+	public void setSampleLineItem(LineItem l) {
+		this.sampleLineItem = l;
+	}
+
+	//1xMANY
+
+	@OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
+	public Collection<LineItem> getLineItems() {
+		return lineItems;
+	}
+
+	public void setLineItems(Collection<LineItem> c) {
+		this.lineItems = c;
+	}
+}
\ No newline at end of file

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Phone.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Phone.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Phone.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,99 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "PHONE_TABLE")
+public class Phone implements java.io.Serializable {
+	private String id;
+	private String area;
+	private String number;
+	private Address address;
+
+	public Phone() {
+	}
+
+	public Phone(String v1, String v2, String v3) {
+		id = v1;
+		area = v2;
+		number = v3;
+	}
+
+	public Phone(String v1, String v2, String v3, Address v4) {
+		id = v1;
+		area = v2;
+		number = v3;
+		address = v4;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		id = v;
+	}
+
+	@Column(name = "AREA")
+	public String getArea() {
+		return area;
+	}
+
+	public void setArea(String v) {
+		area = v;
+	}
+
+	@Column(name = "PHONE_NUMBER")
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String v) {
+		number = v;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "FK_FOR_ADDRESS")
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address a) {
+		address = a;
+	}
+}
\ No newline at end of file

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Spouse.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Spouse.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Spouse.java	2009-12-18 15:32:39 UTC (rev 18268)
@@ -0,0 +1,143 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, 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.metamodel;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+ at Entity
+ at Table(name = "SPOUSE_TABLE")
+public class Spouse implements java.io.Serializable {
+	private String id;
+	private String first;
+	private String maiden;
+	private String last;
+	private String sNumber;
+	private Info info;
+	private Customer customer;
+
+	public Spouse() {
+	}
+
+	public Spouse(
+			String v1, String v2, String v3, String v4,
+			String v5, Info v6) {
+		id = v1;
+		first = v2;
+		maiden = v3;
+		last = v4;
+		sNumber = v5;
+		info = v6;
+	}
+
+
+	public Spouse(
+			String v1, String v2, String v3, String v4,
+			String v5, Info v6, Customer v7) {
+		id = v1;
+		first = v2;
+		maiden = v3;
+		last = v4;
+		sNumber = v5;
+		info = v6;
+		customer = v7;
+	}
+
+	@Id
+	@Column(name = "ID")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String v) {
+		id = v;
+	}
+
+	@Column(name = "FIRSTNAME")
+	public String getFirstName() {
+		return first;
+	}
+
+	public void setFirstName(String v) {
+		first = v;
+	}
+
+	@Column(name = "MAIDENNAME")
+	public String getMaidenName() {
+		return maiden;
+	}
+
+	public void setMaidenName(String v) {
+		maiden = v;
+	}
+
+	@Column(name = "LASTNAME")
+	public String getLastName() {
+		return last;
+	}
+
+	public void setLastName(String v) {
+		last = v;
+	}
+
+	@Column(name = "SOCSECNUM")
+	public String getSocialSecurityNumber() {
+		return sNumber;
+	}
+
+	public void setSocialSecurityNumber(String v) {
+		sNumber = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK_FOR_INFO_TABLE")
+	public Info getInfo() {
+		return info;
+	}
+
+	public void setInfo(Info v) {
+		info = v;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "FK7_FOR_CUSTOMER_TABLE")
+	public Customer getCustomer() {
+		return customer;
+	}
+
+	public void setCustomer(Customer v) {
+		customer = v;
+	}
+
+}



More information about the hibernate-commits mailing list