[hibernate-commits] Hibernate SVN: r17822 - in core/trunk/core/src/main/java/org/hibernate: type and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Oct 22 17:22:46 EDT 2009


Author: steve.ebersole at jboss.com
Date: 2009-10-22 17:22:46 -0400 (Thu, 22 Oct 2009)
New Revision: 17822

Added:
   core/trunk/core/src/main/java/org/hibernate/id/ResultSetIdentifierConsumer.java
Modified:
   core/trunk/core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java
   core/trunk/core/src/main/java/org/hibernate/type/CustomType.java
Log:
HHH-4443 : generic handling of any Hibernate type for post-insert generated identifiers

Modified: core/trunk/core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java	2009-10-22 20:02:10 UTC (rev 17821)
+++ core/trunk/core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java	2009-10-22 21:22:46 UTC (rev 17822)
@@ -33,11 +33,13 @@
 
 import org.hibernate.HibernateException;
 import org.hibernate.type.Type;
+import org.hibernate.type.CustomType;
 
 /**
- * Factory and helper methods for <tt>IdentifierGenerator</tt> framework.
+ * Factory and helper methods for {@link IdentifierGenerator} framework.
  *
  * @author Gavin King
+ * @author Steve Ebersole
  */
 public final class IdentifierGeneratorHelper {
 	private static final Logger log = LoggerFactory.getLogger( IdentifierGeneratorHelper.class );
@@ -94,6 +96,16 @@
 	 * @throws IdentifierGenerationException Indicates an unknown type.
 	 */
 	public static Serializable get(ResultSet rs, Type type) throws SQLException, IdentifierGenerationException {
+		if ( ResultSetIdentifierConsumer.class.isInstance( type ) ) {
+			return ( ( ResultSetIdentifierConsumer ) type ).consumeIdentifier( rs );
+		}
+		if ( CustomType.class.isInstance( type ) ) {
+			final CustomType customType = (CustomType) type;
+			if ( ResultSetIdentifierConsumer.class.isInstance( customType.getUserType() ) ) {
+				return ( (ResultSetIdentifierConsumer) customType.getUserType() ).consumeIdentifier( rs );
+			}
+		}
+
 		Class clazz = type.getReturnedClass();
 		if ( clazz == Long.class ) {
 			return new Long( rs.getLong( 1 ) );

Added: core/trunk/core/src/main/java/org/hibernate/id/ResultSetIdentifierConsumer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/ResultSetIdentifierConsumer.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/ResultSetIdentifierConsumer.java	2009-10-22 21:22:46 UTC (rev 17822)
@@ -0,0 +1,47 @@
+/*
+ * 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.id;
+
+import java.sql.ResultSet;
+import java.io.Serializable;
+
+/**
+ * An optional contract for {@link org.hibernate.type.Type} or
+ * {@link org.hibernate.usertype.UserType} implementations to handle generated
+ * id values any way they see fit as opposed to being limited to the discrete set of
+ * numeric types handled by {@link IdentifierGeneratorHelper}
+ *
+ * @author Steve Ebersole
+ */
+public interface ResultSetIdentifierConsumer {
+	/**
+	 * Given a result set, consume/extract the necessary values and construct an
+	 * appropriate identifier value.
+	 *
+	 * @param resultSet The result set containing the value(s) to be used in building
+	 * the identifier value.
+	 * @return The identifier value.
+	 */
+	public Serializable consumeIdentifier(ResultSet resultSet);
+}

Modified: core/trunk/core/src/main/java/org/hibernate/type/CustomType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/CustomType.java	2009-10-22 20:02:10 UTC (rev 17821)
+++ core/trunk/core/src/main/java/org/hibernate/type/CustomType.java	2009-10-22 21:22:46 UTC (rev 17822)
@@ -93,6 +93,10 @@
 		customLogging = LoggableUserType.class.isAssignableFrom( userTypeClass );
 	}
 
+	public UserType getUserType() {
+		return userType;
+	}
+
 	public int[] sqlTypes(Mapping pi) {
 		return types;
 	}



More information about the hibernate-commits mailing list