Author: steve.ebersole(a)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;
}
Show replies by thread