[hibernate-commits] Hibernate SVN: r19646 - in core/trunk: core/src/main/java/org/hibernate/id/factory and 14 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Jun 1 14:34:14 EDT 2010


Author: steve.ebersole at jboss.com
Date: 2010-06-01 14:34:12 -0400 (Tue, 01 Jun 2010)
New Revision: 19646

Added:
   core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerationStrategy.java
   core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerator.java
   core/trunk/core/src/main/java/org/hibernate/id/uuid/
   core/trunk/core/src/main/java/org/hibernate/id/uuid/CustomVersionOneStrategy.java
   core/trunk/core/src/main/java/org/hibernate/id/uuid/Helper.java
   core/trunk/core/src/main/java/org/hibernate/id/uuid/StandardRandomStrategy.java
   core/trunk/core/src/main/java/org/hibernate/type/UUIDBinaryType.java
   core/trunk/core/src/main/java/org/hibernate/type/UUIDCharType.java
   core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UUIDTypeDescriptor.java
   core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UrlTypeDescriptor.java
   core/trunk/core/src/test/java/org/hibernate/id/uuid/
   core/trunk/core/src/test/java/org/hibernate/id/uuid/CustomVersionOneStrategyTest.java
   core/trunk/core/src/test/java/org/hibernate/type/BasicTypeRegistryTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml
   core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.java
Modified:
   core/trunk/core/src/main/java/org/hibernate/id/GUIDGenerator.java
   core/trunk/core/src/main/java/org/hibernate/id/UUIDHexGenerator.java
   core/trunk/core/src/main/java/org/hibernate/id/factory/DefaultIdentifierGeneratorFactory.java
   core/trunk/core/src/main/java/org/hibernate/type/BasicTypeRegistry.java
   core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/TimeZoneTypeDescriptor.java
   core/trunk/core/src/main/java/org/hibernate/util/BytesHelper.java
   core/trunk/documentation/manual/src/main/docbook/en-US/content/type.xml
Log:
HHH-5268 - Support for java.util.UUID properties/generators


Modified: core/trunk/core/src/main/java/org/hibernate/id/GUIDGenerator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/GUIDGenerator.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/id/GUIDGenerator.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * Copyright (c) 2010, 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 Middleware LLC.
+ * distributed under license by Red Hat Inc.
  *
  * This copyrighted material is made available to anyone wishing to use, modify,
  * copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.id;
 
@@ -41,10 +40,21 @@
  * @author Joseph Fifield
  */
 public class GUIDGenerator implements IdentifierGenerator {
-
 	private static final Logger log = LoggerFactory.getLogger(GUIDGenerator.class);
+	private static boolean warned = false;
 
-	public Serializable generate(SessionImplementor session, Object obj) 
+	public GUIDGenerator() {
+		if ( ! warned ) {
+			warned = true;
+			log.warn(
+					"DEPRECATED : use {} instead with custom {} implementation",
+					UUIDGenerator.class.getName(),
+					UUIDGenerationStrategy.class.getName()
+			);
+		}
+	}
+
+	public Serializable generate(SessionImplementor session, Object obj)
 	throws HibernateException {
 		
 		final String sql = session.getFactory().getDialect().getSelectGUIDString();

Added: core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerationStrategy.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerationStrategy.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerationStrategy.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,64 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * A strategy for generating a variant 2 {@link UUID} value.
+ *
+ * @author Steve Ebersole
+ */
+public interface UUIDGenerationStrategy extends Serializable {
+	/**
+	 * Which variant, according to IETF RFC 4122, of UUID does this strategy generate?  RFC 4122 defines
+	 * 5 variants (though it only describes algorithms to generate 4):<ul>
+	 * <li>1 = time based</li>
+	 * <li>2 = DCE based using POSIX UIDs</li>
+	 * <li>3 = name based (md5 hash)</li>
+	 * <li>4 = random numbers based</li>
+	 * <li>5 = name based (sha-1 hash)</li>
+	 * </ul>
+	 * Returning the values above should be reserved to those generators creating variants compliant with the
+	 * corresponding RFC definition; others can feel free to return other values as they see fit.
+	 * <p/>
+	 * Informational only, and not used at this time.
+	 *
+	 * @return The supported generation version
+	 */
+	public int getGeneratedVersion();
+
+	/**
+	 * Generate the UUID.
+	 *
+	 * @param session The session asking for the generation
+	 *
+	 * @return The generated UUID.
+	 */
+	public UUID generateUUID(SessionImplementor session);
+
+}

Added: core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerator.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/UUIDGenerator.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,112 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id;
+
+import java.io.Serializable;
+import java.util.Properties;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.uuid.StandardRandomStrategy;
+import org.hibernate.type.Type;
+import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * An {@link IdentifierGenerator} which generates {@link UUID} values using a pluggable
+ * {@link UUIDGenerationStrategy generation strategy}.  The values this generator can return
+ * include {@link UUID}, {@link String} and byte[16]
+ * <p/>
+ * Supports 2 config parameters:<ul>
+ * <li>{@link #UUID_GEN_STRATEGY} - names the {@link UUIDGenerationStrategy} instance to use</li>
+ * <li>{@link #UUID_GEN_STRATEGY_CLASS} - names the {@link UUIDGenerationStrategy} class to use</li>
+ * </ul>
+ * <p/>
+ * Currently there are 2 standard implementations of {@link UUIDGenerationStrategy}:<ul>
+ * <li>{@link StandardRandomStrategy} (the default, if none specified)</li>
+ * <li>{@link org.hibernate.id.uuid.CustomVersionOneStrategy}</li>
+ * </ul>
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDGenerator implements IdentifierGenerator, Configurable {
+	public static final String UUID_GEN_STRATEGY = "uuid_gen_strategy";
+	public static final String UUID_GEN_STRATEGY_CLASS = "uuid_gen_strategy_class";
+
+	private static final Logger log = LoggerFactory.getLogger( UUIDGenerator.class );
+
+	private UUIDGenerationStrategy strategy;
+	private UUIDTypeDescriptor.ValueTransformer valueTransformer;
+
+	public void configure(Type type, Properties params, Dialect d) throws MappingException {
+		// check first for the strategy instance
+		strategy = (UUIDGenerationStrategy) params.get( UUID_GEN_STRATEGY );
+		if ( strategy == null ) {
+			// next check for the strategy class
+			final String strategyClassName = params.getProperty( UUID_GEN_STRATEGY_CLASS );
+			if ( strategyClassName != null ) {
+				try {
+					final Class strategyClass = ReflectHelper.classForName( strategyClassName );
+					try {
+						strategy = (UUIDGenerationStrategy) strategyClass.newInstance();
+					}
+					catch ( Exception ignore ) {
+						log.warn( "Unable to instantiate UUID generation strategy class : {}", ignore );
+					}
+				}
+				catch ( ClassNotFoundException ignore ) {
+					log.warn( "Unable to locate requested UUID generation strategy class : {}", strategyClassName );
+				}
+			}
+		}
+		if ( strategy == null ) {
+			// lastly use the standard random generator
+			strategy = StandardRandomStrategy.INSTANCE;
+		}
+
+		if ( UUID.class.isAssignableFrom( type.getReturnedClass() ) ) {
+			valueTransformer = UUIDTypeDescriptor.PassThroughTransformer.INSTANCE;
+		}
+		else if ( String.class.isAssignableFrom( type.getReturnedClass() ) ) {
+			valueTransformer = UUIDTypeDescriptor.ToStringTransformer.INSTANCE;
+		}
+		else if ( byte[].class.isAssignableFrom( type.getReturnedClass() ) ) {
+			valueTransformer = UUIDTypeDescriptor.ToBytesTransformer.INSTANCE;
+		}
+		else {
+			throw new HibernateException( "Unanticipated return type [" + type.getReturnedClass().getName() + "] for UUID conversion" );
+		}
+	}
+
+	public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
+		return valueTransformer.transform( strategy.generateUUID( session ) );
+	}
+
+}

Modified: core/trunk/core/src/main/java/org/hibernate/id/UUIDHexGenerator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/UUIDHexGenerator.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/id/UUIDHexGenerator.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * Copyright (c) 2010, 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 Middleware LLC.
+ * distributed under license by Red Hat Inc.
  *
  * This copyrighted material is made available to anyone wishing to use, modify,
  * copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,14 +20,15 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.id;
 
 import java.io.Serializable;
 import java.util.Properties;
 
-import org.hibernate.Hibernate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.hibernate.dialect.Dialect;
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.type.Type;
@@ -45,54 +46,54 @@
  *
  * @author Gavin King
  */
-
 public class UUIDHexGenerator extends AbstractUUIDGenerator implements Configurable {
+	private static final Logger log = LoggerFactory.getLogger( UUIDHexGenerator.class );
+	private static boolean warned = false;
 
 	private String sep = "";
 
-	protected String format(int intval) {
-		String formatted = Integer.toHexString(intval);
-		StringBuffer buf = new StringBuffer("00000000");
-		buf.replace( 8-formatted.length(), 8, formatted );
-		return buf.toString();
+	public UUIDHexGenerator() {
+		if ( ! warned ) {
+			warned = true;
+			log.warn(
+					"Using {} which does not generate IETF RFC 4122 compliant UUID values; consider using {} instead",
+					this.getClass().getName(),
+					UUIDGenerator.class.getName()
+			);
+		}
 	}
 
-	protected String format(short shortval) {
-		String formatted = Integer.toHexString(shortval);
-		StringBuffer buf = new StringBuffer("0000");
-		buf.replace( 4-formatted.length(), 4, formatted );
-		return buf.toString();
+	/**
+	 * {@inheritDoc}
+	 */
+	public void configure(Type type, Properties params, Dialect d) {
+		sep = PropertiesHelper.getString( "separator", params, "" );
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	public Serializable generate(SessionImplementor session, Object obj) {
-		return new StringBuffer(36)
-			.append( format( getIP() ) ).append(sep)
-			.append( format( getJVM() ) ).append(sep)
-			.append( format( getHiTime() ) ).append(sep)
-			.append( format( getLoTime() ) ).append(sep)
-			.append( format( getCount() ) )
-			.toString();
+		return new StringBuffer( 36 )
+				.append( format( getIP() ) ).append( sep )
+				.append( format( getJVM() ) ).append( sep )
+				.append( format( getHiTime() ) ).append( sep )
+				.append( format( getLoTime() ) ).append( sep )
+				.append( format( getCount() ) )
+				.toString();
 	}
 
-	public void configure(Type type, Properties params, Dialect d) {
-		sep = PropertiesHelper.getString("separator", params, "");
+	protected String format(int intValue) {
+		String formatted = Integer.toHexString( intValue );
+		StringBuffer buf = new StringBuffer( "00000000" );
+		buf.replace( 8 - formatted.length(), 8, formatted );
+		return buf.toString();
 	}
 
-	public static void main( String[] args ) throws Exception {
-		Properties props = new Properties();
-		props.setProperty("separator", "/");
-		IdentifierGenerator gen = new UUIDHexGenerator();
-		( (Configurable) gen ).configure(Hibernate.STRING, props, null);
-		IdentifierGenerator gen2 = new UUIDHexGenerator();
-		( (Configurable) gen2 ).configure(Hibernate.STRING, props, null);
-
-		for ( int i=0; i<10; i++) {
-			String id = (String) gen.generate(null, null);
-			System.out.println(id);
-			String id2 = (String) gen2.generate(null, null);
-			System.out.println(id2);
-		}
-
+	protected String format(short shortValue) {
+		String formatted = Integer.toHexString( shortValue );
+		StringBuffer buf = new StringBuffer( "0000" );
+		buf.replace( 4 - formatted.length(), 4, formatted );
+		return buf.toString();
 	}
-
 }

Modified: core/trunk/core/src/main/java/org/hibernate/id/factory/DefaultIdentifierGeneratorFactory.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/factory/DefaultIdentifierGeneratorFactory.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/id/factory/DefaultIdentifierGeneratorFactory.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -31,6 +31,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.hibernate.id.IdentifierGenerator;
+import org.hibernate.id.UUIDGenerator;
 import org.hibernate.id.UUIDHexGenerator;
 import org.hibernate.id.TableHiLoGenerator;
 import org.hibernate.id.Assigned;
@@ -65,7 +66,10 @@
 	 * Constructs a new DefaultIdentifierGeneratorFactory.
 	 */
 	public DefaultIdentifierGeneratorFactory() {
-		register( "uuid", UUIDHexGenerator.class );
+		register( "uuid2", UUIDGenerator.class );
+		register( "guid", GUIDGenerator.class );			// can be done with UUIDGenerator + strategy
+		register( "uuid", UUIDHexGenerator.class );			// "deprecated" for new use
+		register( "uuid.hex", UUIDHexGenerator.class ); 	// uuid.hex is deprecated
 		register( "hilo", TableHiLoGenerator.class );
 		register( "assigned", Assigned.class );
 		register( "identity", IdentityGenerator.class );
@@ -74,8 +78,6 @@
 		register( "seqhilo", SequenceHiLoGenerator.class );
 		register( "increment", IncrementGenerator.class );
 		register( "foreign", ForeignGenerator.class );
-		register( "guid", GUIDGenerator.class );
-		register( "uuid.hex", UUIDHexGenerator.class ); 	// uuid.hex is deprecated
 		register( "sequence-identity", SequenceIdentityGenerator.class );
 		register( "enhanced-sequence", SequenceStyleGenerator.class );
 		register( "enhanced-table", TableGenerator.class );

Added: core/trunk/core/src/main/java/org/hibernate/id/uuid/CustomVersionOneStrategy.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/uuid/CustomVersionOneStrategy.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/uuid/CustomVersionOneStrategy.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,125 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id.uuid;
+
+import java.util.UUID;
+
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.UUIDGenerationStrategy;
+import org.hibernate.util.BytesHelper;
+
+/**
+ * Applies a version 1 (time-based) generation strategy (using ip address rather than mac address) but applies them in a
+ * different layout.  The strategy is very similar to the legacy {@link org.hibernate.id.UUIDHexGenerator} id generator
+ * but uses a RFC 4122 compliant layout (variant 2).
+ * <p/>
+ * NOTE : Can be a bottle neck due to the need to synchronize in order to increment an
+ * internal count as part of the algorithm.
+ *
+ * @author Steve Ebersole
+ */
+public class CustomVersionOneStrategy implements UUIDGenerationStrategy {
+	public int getGeneratedVersion() {
+		return 1;
+	}
+
+	private final long mostSignificantBits;
+
+	public CustomVersionOneStrategy() {
+		// generate the "most significant bits" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		byte[] hiBits = new byte[8];
+		// use address as first 32 bits (8 * 4 bytes)
+		System.arraycopy( Helper.getAddressBytes(), 0, hiBits, 0, 4 );
+		// use the "jvm identifier" as the next 32 bits
+		System.arraycopy( Helper.getJvmIdentifierBytes(), 0, hiBits, 4, 4 );
+		// set the version (rfc term) appropriately
+		hiBits[6] &= 0x0f;
+		hiBits[6] |= 0x10;
+
+		mostSignificantBits = BytesHelper.asLong( hiBits );
+	}
+
+	public UUID generateUUID(SessionImplementor session) {
+		long leastSignificantBits = generateLeastSignificantBits( System.currentTimeMillis() );
+		return new UUID( mostSignificantBits, leastSignificantBits );
+	}
+
+	public long getMostSignificantBits() {
+		return mostSignificantBits;
+	}
+
+	public static long generateLeastSignificantBits(long seed) {
+		byte[] loBits = new byte[8];
+
+		short hiTime = (short) ( seed >>> 32 );
+		int loTime = (int) seed;
+		System.arraycopy( BytesHelper.fromShort( hiTime ), 0, loBits, 0, 2 );
+		System.arraycopy( BytesHelper.fromInt( loTime ), 0, loBits, 2, 4 );
+		System.arraycopy( Helper.getCountBytes(), 0, loBits, 6, 2 );
+		loBits[0] &= 0x3f;
+		loBits[0] |= ((byte)2 << (byte)6);
+
+		return BytesHelper.asLong( loBits );
+	}
+
+	public static void main(String[] args) {
+		CustomVersionOneStrategy strategy = new CustomVersionOneStrategy();
+
+		for ( int i = 0; i < 1000; i++ ) {
+			System.out.println( "Generation # " + i + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+			byte[] loBits = new byte[8];
+
+			long sysTime = System.currentTimeMillis();
+			short hiTime = (short) ( System.currentTimeMillis() >>> 32 );
+			int loTime = (int) sysTime;
+			System.arraycopy( BytesHelper.fromShort( hiTime ), 0, loBits, 0, 2 );
+			System.arraycopy( BytesHelper.fromInt( loTime ), 0, loBits, 2, 4 );
+			System.arraycopy( Helper.getCountBytes(), 0, loBits, 6, 2 );
+
+			System.out.println( "    before bit setting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+			System.out.println( "       loBits[0] : " + BytesHelper.toBinaryString( loBits[0] ) );
+			System.out.println( "             lsb : " + BytesHelper.toBinaryString( BytesHelper.asLong( loBits ) ) );
+			System.out.println( "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+
+			loBits[0] &= 0x3f;
+			loBits[0] |= ((byte)2 << (byte)6);
+
+			System.out.println( "    after bit setting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+			System.out.println( "       loBits[0] : " + BytesHelper.toBinaryString( loBits[0] ) );
+			long leastSignificantBits = BytesHelper.asLong( loBits );
+			System.out.println( "             lsb : " + BytesHelper.toBinaryString( leastSignificantBits ) );
+			System.out.println( "    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+
+
+			UUID uuid = new UUID( strategy.mostSignificantBits, leastSignificantBits );
+			System.out.println( "  uuid : " + uuid.toString() );
+			System.out.println( "  variant : " + uuid.variant() );
+			System.out.println( "  version : " + uuid.version() );
+			if ( uuid.variant() != 2 ) {
+				throw new RuntimeException( "bad variant" );
+			}
+			System.out.println( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
+		}
+	}
+}

Added: core/trunk/core/src/main/java/org/hibernate/id/uuid/Helper.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/uuid/Helper.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/uuid/Helper.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,147 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id.uuid;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.hibernate.util.BytesHelper;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Helper {
+
+	// IP ADDRESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private static final byte[] ADDRESS_BYTES;
+	private static final int ADDRESS_INT;
+	private static final String ADDRESS_HEX_STRING;
+
+	static {
+		byte[] address;
+		try {
+			address = InetAddress.getLocalHost().getAddress();
+		}
+		catch ( Exception e ) {
+			address = new byte[4];
+		}
+		ADDRESS_BYTES = address;
+		ADDRESS_INT = BytesHelper.toInt( ADDRESS_BYTES );
+		ADDRESS_HEX_STRING = format( ADDRESS_INT );
+	}
+
+	public static byte[] getAddressBytes() {
+		return ADDRESS_BYTES;
+	}
+
+	public static int getAddressInt() {
+		return ADDRESS_INT;
+	}
+
+	public static String getAddressHexString() {
+		return ADDRESS_HEX_STRING;
+	}
+
+
+	// JVM identifier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private static final byte[] JVM_IDENTIFIER_BYTES;
+	private static final int JVM_IDENTIFIER_INT;
+	private static final String JVM_IDENTIFIER_HEX_STRING;
+
+	static {
+		JVM_IDENTIFIER_INT = (int) ( System.currentTimeMillis() >>> 8 );
+		JVM_IDENTIFIER_BYTES = BytesHelper.fromInt( JVM_IDENTIFIER_INT );
+		JVM_IDENTIFIER_HEX_STRING = format( JVM_IDENTIFIER_INT );
+	}
+
+	public static byte[] getJvmIdentifierBytes() {
+		return JVM_IDENTIFIER_BYTES;
+	}
+
+	public static int getJvmIdentifierInt() {
+		return JVM_IDENTIFIER_INT;
+	}
+
+	public static String getJvmIdentifierHexString() {
+		return JVM_IDENTIFIER_HEX_STRING;
+	}
+
+
+	// counter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private static short counter = (short) 0;
+
+	/**
+	 * Unique in a millisecond for this JVM instance (unless there are > Short.MAX_VALUE instances created in a
+	 * millisecond)
+	 */
+	public static short getCountShort() {
+		synchronized ( Helper.class ) {
+			if ( counter < 0 ) {
+				counter = 0;
+			}
+			return counter++;
+		}
+	}
+
+	public static byte[] getCountBytes() {
+		return BytesHelper.fromShort( getCountShort() );
+	}
+
+
+	// Helper methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public static String format(int value) {
+		final String formatted = Integer.toHexString( value );
+		StringBuffer buf = new StringBuffer( "00000000".intern() );
+		buf.replace( 8 - formatted.length(), 8, formatted );
+		return buf.toString();
+	}
+
+	public static String format(short value) {
+		String formatted = Integer.toHexString( value );
+		StringBuffer buf = new StringBuffer( "0000" );
+		buf.replace( 4 - formatted.length(), 4, formatted );
+		return buf.toString();
+	}
+
+
+	public static void main(String[] args) throws UnknownHostException {
+		byte[] addressBytes = InetAddress.getLocalHost().getAddress();
+		System.out.println( "Raw ip address bytes : " + addressBytes.toString() );
+
+		int addressInt = BytesHelper.toInt( addressBytes );
+		System.out.println( "ip address int : " + addressInt );
+
+		String formatted = Integer.toHexString( addressInt );
+		StringBuffer buf = new StringBuffer( "00000000" );
+		buf.replace( 8 - formatted.length(), 8, formatted );
+		String addressHex = buf.toString();
+		System.out.println( "ip address hex : " + addressHex );
+	}
+}

Added: core/trunk/core/src/main/java/org/hibernate/id/uuid/StandardRandomStrategy.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/id/uuid/StandardRandomStrategy.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/id/uuid/StandardRandomStrategy.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,53 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id.uuid;
+
+import java.util.UUID;
+
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.UUIDGenerationStrategy;
+
+/**
+ * Implements a "random" UUID generation strategy as defined by the {@link UUID#randomUUID()} method.
+ *
+ * @author Steve Ebersole
+ */
+public class StandardRandomStrategy implements UUIDGenerationStrategy {
+	public static final StandardRandomStrategy INSTANCE = new StandardRandomStrategy();
+
+	/**
+	 * A variant 4 (random) strategy
+	 */
+	public int getGeneratedVersion() {
+		// a "random" strategy
+		return 4;
+	}
+
+	/**
+	 * Delegates to {@link UUID#randomUUID()}
+	 */
+	public UUID generateUUID(SessionImplementor session) {
+		return UUID.randomUUID();
+	}
+}

Modified: core/trunk/core/src/main/java/org/hibernate/type/BasicTypeRegistry.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/BasicTypeRegistry.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/type/BasicTypeRegistry.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -73,6 +73,8 @@
 		register( CurrencyType.INSTANCE );
 		register( TimeZoneType.INSTANCE );
 		register( ClassType.INSTANCE );
+		register( UUIDBinaryType.INSTANCE );
+		register( UUIDCharType.INSTANCE );
 
 		register( BinaryType.INSTANCE );
 		register( WrapperBinaryType.INSTANCE );

Added: core/trunk/core/src/main/java/org/hibernate/type/UUIDBinaryType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/UUIDBinaryType.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/type/UUIDBinaryType.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.type;
+
+import java.util.UUID;
+
+import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
+import org.hibernate.type.descriptor.sql.BinaryTypeDescriptor;
+
+/**
+ * A type mapping {@link java.sql.Types#BINARY} and {@link UUID}
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDBinaryType extends AbstractSingleColumnStandardBasicType<UUID> {
+	public static final UUIDBinaryType INSTANCE = new UUIDBinaryType();
+
+	public UUIDBinaryType() {
+		super( BinaryTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE );
+	}
+
+	public String getName() {
+		return "uuid-binary";
+	}
+
+	@Override
+	protected boolean registerUnderJavaType() {
+		return true;
+	}
+}

Added: core/trunk/core/src/main/java/org/hibernate/type/UUIDCharType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/UUIDCharType.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/type/UUIDCharType.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.type;
+
+import java.util.UUID;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
+import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
+
+/**
+ * A type mapping {@link java.sql.Types#CHAR} (or {@link java.sql.Types#VARCHAR}) and {@link java.util.UUID}
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDCharType extends AbstractSingleColumnStandardBasicType<UUID> implements LiteralType<UUID> {
+	public static final UUIDCharType INSTANCE = new UUIDCharType();
+
+	public UUIDCharType() {
+		super( CharTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE );
+	}
+
+	public String getName() {
+		return "uuid-char";
+	}
+
+	public String objectToSQLString(UUID value, Dialect dialect) throws Exception {
+		return StringType.INSTANCE.objectToSQLString( value.toString(), dialect );
+	}
+}

Modified: core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/TimeZoneTypeDescriptor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/TimeZoneTypeDescriptor.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/TimeZoneTypeDescriptor.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -29,7 +29,7 @@
 import org.hibernate.type.descriptor.WrapperOptions;
 
 /**
- * TODO : javadoc
+ * Descriptor for {@link TimeZone} handling.
  *
  * @author Steve Ebersole
  */
@@ -79,6 +79,6 @@
 		if ( String.class.isInstance( value ) ) {
 			return fromString( (String) value );
 		}
-		throw unknownUnwrap( value.getClass() );
+		throw unknownWrap( value.getClass() );
 	}
 }

Added: core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UUIDTypeDescriptor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UUIDTypeDescriptor.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UUIDTypeDescriptor.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,132 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.type.descriptor.java;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.hibernate.type.descriptor.WrapperOptions;
+import org.hibernate.util.BytesHelper;
+
+/**
+ * Descriptor for {@link UUID} handling.
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDTypeDescriptor extends AbstractTypeDescriptor<UUID> {
+	public static final UUIDTypeDescriptor INSTANCE = new UUIDTypeDescriptor();
+
+	public UUIDTypeDescriptor() {
+		super( UUID.class );
+	}
+
+	public String toString(UUID value) {
+		return ToStringTransformer.INSTANCE.transform( value );
+	}
+
+	public UUID fromString(String string) {
+		return ToStringTransformer.INSTANCE.parse( string );
+	}
+
+	@SuppressWarnings({ "unchecked" })
+	public <X> X unwrap(UUID value, Class<X> type, WrapperOptions options) {
+		if ( value == null ) {
+			return null;
+		}
+		if ( UUID.class.isAssignableFrom( type ) ) {
+			return (X) PassThroughTransformer.INSTANCE.transform( value );
+		}
+		if ( String.class.isAssignableFrom( type ) ) {
+			return (X) ToStringTransformer.INSTANCE.transform( value );
+		}
+		if ( byte[].class.isAssignableFrom( type ) ) {
+			return (X) ToBytesTransformer.INSTANCE.transform( value );
+		}
+		throw unknownUnwrap( type );
+	}
+
+	public <X> UUID wrap(X value, WrapperOptions options) {
+		if ( value == null ) {
+			return null;
+		}
+		if ( UUID.class.isInstance( value ) ) {
+			return PassThroughTransformer.INSTANCE.parse( value );
+		}
+		if ( String.class.isInstance( value ) ) {
+			return ToStringTransformer.INSTANCE.parse( value );
+		}
+		if ( byte[].class.isInstance( value ) ) {
+			return ToBytesTransformer.INSTANCE.parse( value );
+		}
+		throw unknownWrap( value.getClass() );
+	}
+
+	public static interface ValueTransformer {
+		public Serializable transform(UUID uuid);
+		public UUID parse(Object value);
+	}
+
+	public static class PassThroughTransformer implements ValueTransformer {
+		public static final PassThroughTransformer INSTANCE = new PassThroughTransformer();
+
+		public UUID transform(UUID uuid) {
+			return uuid;
+		}
+
+		public UUID parse(Object value) {
+			return (UUID)value;
+		}
+	}
+
+	public static class ToStringTransformer implements ValueTransformer {
+		public static final ToStringTransformer INSTANCE = new ToStringTransformer();
+
+		public String transform(UUID uuid) {
+			return uuid.toString();
+		}
+
+		public UUID parse(Object value) {
+			return UUID.fromString( (String) value );
+		}
+	}
+
+	public static class ToBytesTransformer implements ValueTransformer {
+		public static final ToBytesTransformer INSTANCE = new ToBytesTransformer();
+
+		public byte[] transform(UUID uuid) {
+			byte[] bytes = new byte[16];
+			System.arraycopy( BytesHelper.fromLong( uuid.getMostSignificantBits() ), 0, bytes, 0, 8 );
+			System.arraycopy( BytesHelper.fromLong( uuid.getLeastSignificantBits() ), 0, bytes, 8, 8 );
+			return bytes;
+		}
+
+		public UUID parse(Object value) {
+			byte[] msb = new byte[8];
+			byte[] lsb = new byte[8];
+			System.arraycopy( value, 0, msb, 0, 8 );
+			System.arraycopy( value, 8, lsb, 0, 8 );
+			return new UUID( BytesHelper.asLong( msb ), BytesHelper.asLong( lsb ) );
+		}
+	}
+}

Added: core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UrlTypeDescriptor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UrlTypeDescriptor.java	                        (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/type/descriptor/java/UrlTypeDescriptor.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.type.descriptor.java;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.hibernate.HibernateException;
+import org.hibernate.type.descriptor.WrapperOptions;
+
+/**
+ * Descriptor for {@link URL} handling.
+ *
+ * @author Steve Ebersole
+ */
+public class UrlTypeDescriptor extends AbstractTypeDescriptor<URL> {
+	public static final UrlTypeDescriptor INSTANCE = new UrlTypeDescriptor();
+
+	public UrlTypeDescriptor() {
+		super( URL.class );
+	}
+
+	public String toString(URL value) {
+		return value.toExternalForm();
+	}
+
+	public URL fromString(String string) {
+		try {
+			return new URL( string );
+		}
+		catch ( MalformedURLException e ) {
+			throw new HibernateException( "Unable to convert string [" + string + "] to URL : " + e );
+		}
+	}
+
+	@SuppressWarnings({ "unchecked" })
+	public <X> X unwrap(URL value, Class<X> type, WrapperOptions options) {
+		if ( value == null ) {
+			return null;
+		}
+		if ( String.class.isAssignableFrom( type ) ) {
+			return (X) toString( value );
+		}
+		throw unknownUnwrap( type );
+	}
+
+	public <X> URL wrap(X value, WrapperOptions options) {
+		if ( value == null ) {
+			return null;
+		}
+		if ( String.class.isInstance( value ) ) {
+			return fromString( (String) value );
+		}
+		throw unknownWrap( value.getClass() );
+	}
+}

Modified: core/trunk/core/src/main/java/org/hibernate/util/BytesHelper.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/util/BytesHelper.java	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/core/src/main/java/org/hibernate/util/BytesHelper.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -1,10 +1,10 @@
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * Copyright (c) 2010, 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 Middleware LLC.
+ * distributed under license by Red Hat Inc.
  *
  * This copyrighted material is made available to anyone wishing to use, modify,
  * copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,26 +20,123 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.hibernate.util;
 
 public final class BytesHelper {
 
-	private BytesHelper() {}
+	private BytesHelper() {
+	}
 
-	public static int toInt( byte[] bytes ) {
+	/**
+	 * Custom algorithm used to generate an int from a series of bytes.
+	 * <p/>
+	 * NOTE : this is different than interpreting the incoming bytes as an int value!
+	 *
+	 * @param bytes The bytes to use in generating the int.
+	 *
+	 * @return The generated int.
+	 */
+	public static int toInt(byte[] bytes) {
 		int result = 0;
-		for (int i=0; i<4; i++) {
+		for ( int i = 0; i < 4; i++ ) {
 			result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];
 		}
 		return result;
 	}
-	
-}
 
+	/**
+	 * Interpret a short as its binary form
+	 *
+	 * @param shortValue The short to interpret to binary
+	 *
+	 * @return The binary
+	 */
+	public static byte[] fromShort(int shortValue) {
+		byte[] bytes = new byte[2];
+		bytes[0] = (byte) ( shortValue >> 8 );
+		bytes[1] = (byte) ( ( shortValue << 8 ) >> 8 );
+		return bytes;
+	}
 
+	/**
+	 * Interpret an int as its binary form
+	 *
+	 * @param intValue The int to interpret to binary
+	 *
+	 * @return The binary
+	 */
+	public static byte[] fromInt(int intValue) {
+		byte[] bytes = new byte[4];
+		bytes[0] = (byte) ( intValue >> 24 );
+		bytes[1] = (byte) ( ( intValue << 8 ) >> 24 );
+		bytes[2] = (byte) ( ( intValue << 16 ) >> 24 );
+		bytes[3] = (byte) ( ( intValue << 24 ) >> 24 );
+		return bytes;
+	}
 
+	/**
+	 * Interpret a long as its binary form
+	 *
+	 * @param longValue The long to interpret to binary
+	 *
+	 * @return The binary
+	 */
+	public static byte[] fromLong(long longValue) {
+		byte[] bytes = new byte[8];
+		bytes[0] = (byte) ( longValue >> 56 );
+		bytes[1] = (byte) ( ( longValue << 8 ) >> 56 );
+		bytes[2] = (byte) ( ( longValue << 16 ) >> 56 );
+		bytes[3] = (byte) ( ( longValue << 24 ) >> 56 );
+		bytes[4] = (byte) ( ( longValue << 32 ) >> 56 );
+		bytes[5] = (byte) ( ( longValue << 40 ) >> 56 );
+		bytes[6] = (byte) ( ( longValue << 48 ) >> 56 );
+		bytes[7] = (byte) ( ( longValue << 56 ) >> 56 );
+		return bytes;
+	}
 
+	/**
+	 * Interpret the binary representation of a long.
+	 *
+	 * @param bytes The bytes to interpret.
+	 *
+	 * @return The long
+	 */
+	public static long asLong(byte[] bytes) {
+		if ( bytes == null ) {
+			return 0;
+		}
+		if ( bytes.length != 8 ) {
+			throw new IllegalArgumentException( "Expecting 8 byte values to construct a long" );
+		}
+		long value = 0;
+        for (int i=0; i<8; i++) {
+			value = (value << 8) | (bytes[i] & 0xff);
+		}
+		return value;
+	}
 
+	public static String toBinaryString(byte value) {
+		String formatted = Integer.toBinaryString( value );
+		if ( formatted.length() > 8 ) {
+			formatted = formatted.substring( formatted.length() - 8 );
+		}
+		StringBuffer buf = new StringBuffer( "00000000" );
+		buf.replace( 8 - formatted.length(), 8, formatted );
+		return buf.toString();
+	}
 
+	public static String toBinaryString(int value) {
+		String formatted = Long.toBinaryString( value );
+		StringBuffer buf = new StringBuffer( StringHelper.repeat( '0', 32 ) );
+		buf.replace( 64 - formatted.length(), 64, formatted );
+		return buf.toString();
+	}
+
+	public static String toBinaryString(long value) {
+		String formatted = Long.toBinaryString( value );
+		StringBuffer buf = new StringBuffer( StringHelper.repeat( '0', 64 ) );
+		buf.replace( 64 - formatted.length(), 64, formatted );
+		return buf.toString();
+	}
+}

Added: core/trunk/core/src/test/java/org/hibernate/id/uuid/CustomVersionOneStrategyTest.java
===================================================================
--- core/trunk/core/src/test/java/org/hibernate/id/uuid/CustomVersionOneStrategyTest.java	                        (rev 0)
+++ core/trunk/core/src/test/java/org/hibernate/id/uuid/CustomVersionOneStrategyTest.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.id.uuid;
+
+import java.util.UUID;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class CustomVersionOneStrategyTest extends TestCase {
+	public static void main(String[] args) {
+		System.out.println( System.currentTimeMillis() );
+		System.out.println( Long.MAX_VALUE );
+	}
+	public void testUniqueCounter() {
+		CustomVersionOneStrategy strategy = new CustomVersionOneStrategy();
+		long now = System.currentTimeMillis();
+		UUID uuid1 = new UUID(
+				strategy.getMostSignificantBits(),
+				CustomVersionOneStrategy.generateLeastSignificantBits( now )
+		);
+		assertEquals( 2, uuid1.variant() );
+		assertEquals( 1, uuid1.version() );
+
+		for ( int i = 0; i < 100; i++ ) {
+			UUID uuidX = new UUID(
+					strategy.getMostSignificantBits(),
+					CustomVersionOneStrategy.generateLeastSignificantBits( now )
+			);
+			assertEquals( 2, uuidX.variant() );
+			assertEquals( 1, uuidX.version() );
+			assertFalse( uuid1.equals( uuidX ) );
+			assertEquals( uuid1.getMostSignificantBits(), uuidX.getMostSignificantBits() );
+		}
+	}
+
+	public void testRangeOfValues() {
+		CustomVersionOneStrategy strategy = new CustomVersionOneStrategy();
+
+		UUID uuid = new UUID(
+				strategy.getMostSignificantBits(),
+				CustomVersionOneStrategy.generateLeastSignificantBits( 0 )
+		);
+		assertEquals( 2, uuid.variant() );
+		assertEquals( 1, uuid.version() );
+
+		uuid = new UUID(
+				strategy.getMostSignificantBits(),
+				CustomVersionOneStrategy.generateLeastSignificantBits( Long.MAX_VALUE )
+		);
+		assertEquals( 2, uuid.variant() );
+		assertEquals( 1, uuid.version() );
+	}
+}

Added: core/trunk/core/src/test/java/org/hibernate/type/BasicTypeRegistryTest.java
===================================================================
--- core/trunk/core/src/test/java/org/hibernate/type/BasicTypeRegistryTest.java	                        (rev 0)
+++ core/trunk/core/src/test/java/org/hibernate/type/BasicTypeRegistryTest.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,86 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.type;
+
+import java.net.URL;
+import java.util.UUID;
+
+import junit.framework.TestCase;
+
+import org.hibernate.type.descriptor.java.UrlTypeDescriptor;
+import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class BasicTypeRegistryTest extends TestCase {
+	private final BasicTypeRegistry registry = new BasicTypeRegistry();
+
+	public void testOverriding() {
+		BasicType type = registry.getRegisteredType( "uuid-binary" );
+		assertSame( UUIDBinaryType.INSTANCE, type );
+		type = registry.getRegisteredType( UUID.class.getName() );
+		assertSame( UUIDBinaryType.INSTANCE, type );
+
+		BasicType override = new UUIDCharType() {
+			@Override
+			protected boolean registerUnderJavaType() {
+				return true;
+			}
+		};
+		registry.register( override );
+		type = registry.getRegisteredType( UUID.class.getName() );
+		assertNotSame( UUIDBinaryType.INSTANCE, type );
+		assertSame( override, type );
+	}
+
+	public void testExpanding() {
+		BasicType type = registry.getRegisteredType( URL.class.getName() );
+		assertNull( type );
+
+		registry.register( UrlType.INSTANCE );
+		type = registry.getRegisteredType( URL.class.getName() );
+		assertNotNull( type );
+		assertSame( UrlType.INSTANCE, type );
+	}
+
+	public static class UrlType extends AbstractSingleColumnStandardBasicType<URL> {
+		public static final UrlType INSTANCE = new UrlType();
+
+		public UrlType() {
+			super( VarcharTypeDescriptor.INSTANCE, UrlTypeDescriptor.INSTANCE );
+		}
+
+		public String getName() {
+			return "url";
+		}
+
+		@Override
+		protected boolean registerUnderJavaType() {
+			return true;
+		}
+	}
+}

Modified: core/trunk/documentation/manual/src/main/docbook/en-US/content/type.xml
===================================================================
--- core/trunk/documentation/manual/src/main/docbook/en-US/content/type.xml	2010-06-01 16:14:56 UTC (rev 19645)
+++ core/trunk/documentation/manual/src/main/docbook/en-US/content/type.xml	2010-06-01 18:34:12 UTC (rev 19646)
@@ -583,8 +583,37 @@
                     </varlistentry>
                 </variablelist>
             </section>
+            <section id="types.basic.value.uuid">
+                <title><classname>java.util.UUID</classname></title>
+                <variablelist>
+                    <varlistentry>
+                        <term><classname>org.hibernate.type.UUIDBinaryType</classname></term>
+                        <listitem>
+                            <para>
+                                Maps a java.util.UUID to a JDBC BINARY
+                            </para>
+                            <para>
+                                Registered under <literal>uuid-binary</literal> and <literal>java.util.UUID</literal>
+                                in the type registry (see <xref linkend="types.registry"/>).
+                            </para>
+                        </listitem>
+                    </varlistentry>
+                    <varlistentry>
+                        <term><classname>org.hibernate.type.UUIDCharType</classname></term>
+                        <listitem>
+                            <para>
+                                Maps a java.util.UUID to a JDBC CHAR (though VARCHAR is fine too for existing schemas)
+                            </para>
+                            <para>
+                                Registered under <literal>uuid-char</literal> in the type registry (see
+                                <xref linkend="types.registry"/>).
+                            </para>
+                        </listitem>
+                    </varlistentry>
+                </variablelist>
+            </section>
             <section id="types.basic.value.serializable">
-                <title>java.io.Serializable</title>
+                <title><classname>java.io.Serializable</classname></title>
                 <variablelist>
                     <varlistentry>
                         <term><classname>org.hibernate.type.SerializableType</classname></term>

Copied: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml (from rev 19581, core/trunk/testsuite/src/test/java/org/hibernate/test/id/Car.hbm.xml)
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, 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
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.id.uuid.sqlrep">
+
+    <class name="Node">
+    
+    	<id name="id">
+    		<generator class="uuid2"/>
+    	</id>
+        <property name="name"/>
+        <many-to-one name="parent"/>
+	</class>
+
+</hibernate-mapping>

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/Node.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,73 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.test.id.uuid.sqlrep;
+
+import java.util.UUID;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Node {
+	private UUID id;
+	private String name;
+	private Node parent;
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+	}
+
+	public Node(String name, Node parent) {
+		this.name = name;
+		this.parent = parent;
+	}
+
+	public UUID getId() {
+		return id;
+	}
+
+	public void setId(UUID id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Node getParent() {
+		return parent;
+	}
+
+	public void setParent(Node parent) {
+		this.parent = parent;
+	}
+}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,81 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.test.id.uuid.sqlrep.sqlbinary;
+
+import org.hibernate.Session;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.test.id.uuid.sqlrep.Node;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDBinaryTest extends FunctionalTestCase {
+	public UUIDBinaryTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "id/uuid/sqlrep/Node.hbm.xml" };
+	}
+
+	public void testUsage() {
+		Session session = openSession();
+		session.beginTransaction();
+		Node root = new Node( "root" );
+		session.save( root );
+		assertNotNull( root.getId() );
+		Node child = new Node( "child", root );
+		session.save( child );
+		assertNotNull( child.getId() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		Node node = (Node) session.get( Node.class, root.getId() );
+		assertNotNull( node );
+		node = (Node) session.get( Node.class, child.getId() );
+		assertNotNull( node );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		// test joining
+		node = (Node) session.createQuery( "from Node n join fetch n.parent where n.parent is not null" ).uniqueResult();
+		assertNotNull( node );
+		assertNotNull( node.getParent() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( child );
+		session.delete( root );
+		session.getTransaction().commit();
+		session.close();
+	}
+}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.test.id.uuid.sqlrep.sqlchar;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.test.id.uuid.sqlrep.sqlbinary.UUIDBinaryTest;
+import org.hibernate.type.UUIDCharType;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDCharTest extends UUIDBinaryTest {
+	public UUIDCharTest(String string) {
+		super( string );
+	}
+
+	@Override
+	public void configure(Configuration cfg) {
+		cfg.registerTypeOverride(
+				new UUIDCharType() {
+					@Override
+					protected boolean registerUnderJavaType() {
+						return true;
+					}
+				}
+		);
+	}
+}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,60 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.test.id.uuid.strategy;
+
+import org.hibernate.Session;
+import org.hibernate.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class CustomStrategyTest extends FunctionalTestCase {
+	public CustomStrategyTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "id/uuid/strategy/Node.hbm.xml" };
+	}
+
+	public void testUsage() {
+		Session session = openSession();
+		session.beginTransaction();
+		Node node = new Node();
+		session.save( node );
+		assertNotNull( node.getId() );
+		assertEquals( 2, node.getId().variant() );
+		assertEquals( 1, node.getId().version() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( node );
+		session.getTransaction().commit();
+		session.close();
+	}
+}

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, 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
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.id.uuid.strategy">
+
+    <class name="Node">
+    
+    	<id name="id">
+    		<generator class="uuid2">
+                <!-- the "standard random" strategy gets tested in the other id.uuid tests -->
+                <param name="uuid_gen_strategy_class">org.hibernate.id.uuid.CustomVersionOneStrategy</param>
+    		</generator>
+    	</id>
+        <property name="name"/>
+	</class>
+
+</hibernate-mapping>

Added: core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/id/uuid/strategy/Node.java	2010-06-01 18:34:12 UTC (rev 19646)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.test.id.uuid.strategy;
+
+import java.util.UUID;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Node {
+	private UUID id;
+	private String name;
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+	}
+
+	public UUID getId() {
+		return id;
+	}
+
+	public void setId(UUID id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}



More information about the hibernate-commits mailing list