[hibernate-commits] Hibernate SVN: r11326 - in branches/Branch_3_2/Hibernate3: test/org/hibernate/test/idgen and 3 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Mar 20 22:54:45 EDT 2007


Author: steve.ebersole at jboss.com
Date: 2007-03-20 22:54:45 -0400 (Tue, 20 Mar 2007)
New Revision: 11326

Added:
   branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/TableGenerator.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Entity.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java
Removed:
   branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicTableTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoTableTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledTableTest.java
Modified:
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/IdGenSuite.java
Log:
HHH-2471 : enhanced generator : table

Deleted: branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java	2007-03-21 02:54:23 UTC (rev 11325)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -1,304 +0,0 @@
-package org.hibernate.id.enhanced;
-
-import java.sql.Types;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.Properties;
-import java.util.HashMap;
-import java.io.Serializable;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.hibernate.engine.TransactionHelper;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.id.PersistentIdentifierGenerator;
-import org.hibernate.id.Configurable;
-import org.hibernate.type.Type;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.LockMode;
-import org.hibernate.mapping.Table;
-import org.hibernate.util.PropertiesHelper;
-import org.hibernate.util.StringHelper;
-import org.hibernate.util.CollectionHelper;
-
-/**
- * A "segmented" version of the enhanced table generator.  The term "segmented"
- * refers to the fact that this table can hold multiple value generators,
- * segmented by a key.
- * <p/>
- * Configuration parameters:
- * <table>
- * 	 <tr>
- *     <td><b>NAME</b></td>
- *     <td><b>DEFAULT</b></td>
- *     <td><b>DESCRIPTION</b></td>
- *   </tr>
- *   <tr>
- *     <td>{@link #TABLE_PARAM}</td>
- *     <td>{@link #DEF_TABLE}</td>
- *     <td>The name of the table to use to store/retrieve values</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #VALUE_COLUMN_PARAM}</td>
- *     <td>{@link #DEF_VALUE_COLUMN}</td>
- *     <td>The name of column which holds the sequence value for the given segment</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #SEGMENT_COLUMN_PARAM}</td>
- *     <td>{@link #DEF_SEGMENT_COLUMN}</td>
- *     <td>The name of the column which holds the segment key</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #SEGMENT_VALUE_PARAM}</td>
- *     <td>{@link #DEF_SEGMENT_VALUE}</td>
- *     <td>The value indicating which segment is used by this generator; refers to values in the {@link #SEGMENT_COLUMN_PARAM} column</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #SEGMENT_LENGTH_PARAM}</td>
- *     <td>{@link #DEF_SEGMENT_LENGTH}</td>
- *     <td>The data length of the {@link #SEGMENT_COLUMN_PARAM} column; used for schema creation</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #INITIAL_PARAM}</td>
- *     <td>{@link #DEFAULT_INITIAL_VALUE}</td>
- *     <td>The initial value to be stored for the given segment</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #INCREMENT_PARAM}</td>
- *     <td>{@link #DEFAULT_INCREMENT_SIZE}</td>
- *     <td>The increment size for the underlying segment; see the discussion on {@link Optimizer} for more details.</td>
- *   </tr>
- *   <tr>
- *     <td>{@link #OPT_PARAM}</td>
- *     <td><i>depends on defined increment size</i></td>
- *     <td>Allows explicit definition of which optimization strategy to use</td>
- *   </tr>
- * </table>
- *
- * @author Steve Ebersole
- */
-public class SegmentedTableGenerator extends TransactionHelper implements PersistentIdentifierGenerator, Configurable {
-	private static final Log log = LogFactory.getLog( SegmentedTableGenerator.class );
-
-	public static final String TABLE_PARAM = "table_name";
-	public static final String DEF_TABLE = "hibernate_sequences";
-
-	public static final String VALUE_COLUMN_PARAM = "value_column_name";
-	public static final String DEF_VALUE_COLUMN = "next_val";
-
-	public static final String SEGMENT_COLUMN_PARAM = "segment_column_name";
-	public static final String DEF_SEGMENT_COLUMN = "sequence_name";
-
-	public static final String SEGMENT_VALUE_PARAM = "segment_value";
-	public static final String DEF_SEGMENT_VALUE = "default";
-
-	public static final String SEGMENT_LENGTH_PARAM = "segment_value_length";
-	public static final int DEF_SEGMENT_LENGTH = 255;
-
-	public static final String INITIAL_PARAM = "initial_value";
-	public static final int DEFAULT_INITIAL_VALUE = 1;
-
-	public static final String INCREMENT_PARAM = "increment_size";
-	public static final int DEFAULT_INCREMENT_SIZE = 1;
-
-	public static final String OPT_PARAM = "optimizer";
-
-
-	private String tableName;
-	private String valueColumnName;
-	private String segmentColumnName;
-	private String segmentValue;
-	private int segmentValueLength;
-	private int initialValue;
-	private int incrementSize;
-
-	private Type identifierType;
-
-	private String query;
-	private String insert;
-	private String update;
-
-	private Optimizer optimizer;
-
-	public String getTableName() {
-		return tableName;
-	}
-
-	public String getSegmentColumnName() {
-		return segmentColumnName;
-	}
-
-	public String getSegmentValue() {
-		return segmentValue;
-	}
-
-	public int getSegmentValueLength() {
-		return segmentValueLength;
-	}
-
-	public String getValueColumnName() {
-		return valueColumnName;
-	}
-
-	public Type getIdentifierType() {
-		return identifierType;
-	}
-
-	public int getInitialValue() {
-		return initialValue;
-	}
-
-	public int getIncrementSize() {
-		return incrementSize;
-	}
-
-	public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
-		tableName = PropertiesHelper.getString( TABLE_PARAM, params, DEF_TABLE );
-		if ( tableName.indexOf( '.' ) < 0 ) {
-			String schemaName = params.getProperty( SCHEMA );
-			String catalogName = params.getProperty( CATALOG );
-			tableName = Table.qualify( catalogName, schemaName, tableName );
-		}
-
-		segmentColumnName = PropertiesHelper.getString( SEGMENT_COLUMN_PARAM, params, DEF_SEGMENT_COLUMN );
-		segmentValue = params.getProperty( SEGMENT_VALUE_PARAM );
-		if ( StringHelper.isEmpty( segmentValue ) ) {
-			log.debug( "explicit segment value for id generator [" + tableName + '.' + segmentColumnName + "] suggested; using default [" + DEF_SEGMENT_VALUE + "]" );
-			segmentValue = DEF_SEGMENT_VALUE;
-		}
-		segmentValueLength = PropertiesHelper.getInt( SEGMENT_LENGTH_PARAM, params, DEF_SEGMENT_LENGTH );
-		valueColumnName = PropertiesHelper.getString( VALUE_COLUMN_PARAM, params, DEF_VALUE_COLUMN );
-		initialValue = PropertiesHelper.getInt( INITIAL_PARAM, params, DEFAULT_INITIAL_VALUE );
-		incrementSize = PropertiesHelper.getInt( INCREMENT_PARAM, params, DEFAULT_INCREMENT_SIZE );
-		identifierType = type;
-
-		String query = "select " + valueColumnName +
-				" from " + tableName + " tbl" +
-				" where tbl." + segmentColumnName + "=?";
-		HashMap lockMap = new HashMap();
-		lockMap.put( "tbl", LockMode.UPGRADE );
-		this.query = dialect.applyLocksToSql( query, lockMap, CollectionHelper.EMPTY_MAP );
-
-		update = "update " + tableName +
-				" set " + valueColumnName + "=? " +
-				" where " + valueColumnName + "=? and " + segmentColumnName + "=?";
-
-		insert = "insert into " + tableName + " (" + segmentColumnName + ", " + valueColumnName + ") " + " values (?,?)";
-
-		String defOptStrategy = incrementSize <= 1 ? OptimizerFactory.NONE : OptimizerFactory.POOL;
-		String optimizationStrategy = PropertiesHelper.getString( OPT_PARAM, params, defOptStrategy );
-		optimizer = OptimizerFactory.buildOptimizer( optimizationStrategy, identifierType.getReturnedClass(), incrementSize );
-	}
-
-	public synchronized Serializable generate(final SessionImplementor session, Object obj) {
-		return optimizer.generate(
-				new AccessCallback() {
-					public long getNextValue() {
-						return ( ( Number ) doWorkInNewTransaction( session ) ).longValue();
-					}
-				}
-		);
-	}
-
-	public Serializable doWorkInCurrentTransaction(Connection conn, String sql) throws SQLException {
-		int result;
-		int rows;
-		do {
-			sql = query;
-			SQL.debug( sql );
-			PreparedStatement queryPS = conn.prepareStatement( query );
-			try {
-				queryPS.setString( 1, segmentValue );
-				ResultSet queryRS = queryPS.executeQuery();
-				if ( !queryRS.next() ) {
-					PreparedStatement insertPS = null;
-					try {
-						result = initialValue;
-						sql = insert;
-						SQL.debug( sql );
-						insertPS = conn.prepareStatement( insert );
-						insertPS.setString( 1, segmentValue );
-						insertPS.setLong( 2, result );
-						insertPS.execute();
-					}
-					finally {
-						if ( insertPS != null ) {
-							insertPS.close();
-						}
-					}
-				}
-				else {
-					result = queryRS.getInt( 1 );
-				}
-				queryRS.close();
-			}
-			catch ( SQLException sqle ) {
-				log.error( "could not read or init a hi value", sqle );
-				throw sqle;
-			}
-			finally {
-				queryPS.close();
-			}
-
-			sql = update;
-			SQL.debug( sql );
-			PreparedStatement updatePS = conn.prepareStatement( update );
-			try {
-				long newValue = optimizer.applyIncrementSizeToSourceValues()
-						? result + incrementSize : result + 1;
-				updatePS.setLong( 1, newValue );
-				updatePS.setLong( 2, result );
-				updatePS.setString( 3, segmentValue );
-				rows = updatePS.executeUpdate();
-			}
-			catch ( SQLException sqle ) {
-				log.error( "could not update hi value in: " + tableName, sqle );
-				throw sqle;
-			}
-			finally {
-				updatePS.close();
-			}
-		}
-		while ( rows == 0 );
-		return new Integer( result );
-	}
-
-	public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
-		return new String[] {
-				new StringBuffer()
-						.append( dialect.getCreateTableString() )
-						.append( tableName )
-						.append( " ( " )
-						.append( segmentColumnName )
-						.append( ' ' )
-						.append( dialect.getTypeName( Types.VARCHAR, segmentValueLength, 0, 0 ) )
-						.append( ",  " )
-						.append( valueColumnName )
-						.append( ' ' )
-						.append( dialect.getTypeName( Types.BIGINT ) )
-						.append( " ) " )
-						.toString()
-		};
-	}
-
-	public String[] sqlDropStrings(Dialect dialect) throws HibernateException {
-		StringBuffer sqlDropString = new StringBuffer().append( "drop table " );
-		if ( dialect.supportsIfExistsBeforeTableName() ) {
-			sqlDropString.append( "if exists " );
-		}
-		sqlDropString.append( tableName ).append( dialect.getCascadeConstraintsString() );
-		if ( dialect.supportsIfExistsAfterTableName() ) {
-			sqlDropString.append( " if exists" );
-		}
-		return new String[] { sqlDropString.toString() };
-	}
-
-	public Object generatorKey() {
-		return tableName;
-	}
-}

Copied: branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/TableGenerator.java (from rev 11304, branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/SegmentedTableGenerator.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/TableGenerator.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/id/enhanced/TableGenerator.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,317 @@
+package org.hibernate.id.enhanced;
+
+import java.sql.Types;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Properties;
+import java.util.HashMap;
+import java.io.Serializable;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.hibernate.engine.TransactionHelper;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.PersistentIdentifierGenerator;
+import org.hibernate.id.Configurable;
+import org.hibernate.type.Type;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.LockMode;
+import org.hibernate.mapping.Table;
+import org.hibernate.util.PropertiesHelper;
+import org.hibernate.util.StringHelper;
+import org.hibernate.util.CollectionHelper;
+
+/**
+ * A "segmented" version of the enhanced table generator.  The term "segmented"
+ * refers to the fact that this table can hold multiple value generators,
+ * segmented by a key.
+ * <p/>
+ * Configuration parameters:
+ * <table>
+ * 	 <tr>
+ *     <td><b>NAME</b></td>
+ *     <td><b>DEFAULT</b></td>
+ *     <td><b>DESCRIPTION</b></td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #TABLE_PARAM}</td>
+ *     <td>{@link #DEF_TABLE}</td>
+ *     <td>The name of the table to use to store/retrieve values</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #VALUE_COLUMN_PARAM}</td>
+ *     <td>{@link #DEF_VALUE_COLUMN}</td>
+ *     <td>The name of column which holds the sequence value for the given segment</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #SEGMENT_COLUMN_PARAM}</td>
+ *     <td>{@link #DEF_SEGMENT_COLUMN}</td>
+ *     <td>The name of the column which holds the segment key</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #SEGMENT_VALUE_PARAM}</td>
+ *     <td>{@link #DEF_SEGMENT_VALUE}</td>
+ *     <td>The value indicating which segment is used by this generator; refers to values in the {@link #SEGMENT_COLUMN_PARAM} column</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #SEGMENT_LENGTH_PARAM}</td>
+ *     <td>{@link #DEF_SEGMENT_LENGTH}</td>
+ *     <td>The data length of the {@link #SEGMENT_COLUMN_PARAM} column; used for schema creation</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #INITIAL_PARAM}</td>
+ *     <td>{@link #DEFAULT_INITIAL_VALUE}</td>
+ *     <td>The initial value to be stored for the given segment</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #INCREMENT_PARAM}</td>
+ *     <td>{@link #DEFAULT_INCREMENT_SIZE}</td>
+ *     <td>The increment size for the underlying segment; see the discussion on {@link Optimizer} for more details.</td>
+ *   </tr>
+ *   <tr>
+ *     <td>{@link #OPT_PARAM}</td>
+ *     <td><i>depends on defined increment size</i></td>
+ *     <td>Allows explicit definition of which optimization strategy to use</td>
+ *   </tr>
+ * </table>
+ *
+ * @author Steve Ebersole
+ */
+public class TableGenerator extends TransactionHelper implements PersistentIdentifierGenerator, Configurable {
+	private static final Log log = LogFactory.getLog( TableGenerator.class );
+
+	public static final String TABLE_PARAM = "table_name";
+	public static final String DEF_TABLE = "hibernate_sequences";
+
+	public static final String VALUE_COLUMN_PARAM = "value_column_name";
+	public static final String DEF_VALUE_COLUMN = "next_val";
+
+	public static final String SEGMENT_COLUMN_PARAM = "segment_column_name";
+	public static final String DEF_SEGMENT_COLUMN = "sequence_name";
+
+	public static final String SEGMENT_VALUE_PARAM = "segment_value";
+	public static final String DEF_SEGMENT_VALUE = "default";
+
+	public static final String SEGMENT_LENGTH_PARAM = "segment_value_length";
+	public static final int DEF_SEGMENT_LENGTH = 255;
+
+	public static final String INITIAL_PARAM = "initial_value";
+	public static final int DEFAULT_INITIAL_VALUE = 1;
+
+	public static final String INCREMENT_PARAM = "increment_size";
+	public static final int DEFAULT_INCREMENT_SIZE = 1;
+
+	public static final String OPT_PARAM = "optimizer";
+
+
+	private String tableName;
+	private String valueColumnName;
+	private String segmentColumnName;
+	private String segmentValue;
+	private int segmentValueLength;
+	private int initialValue;
+	private int incrementSize;
+
+	private Type identifierType;
+
+	private String query;
+	private String insert;
+	private String update;
+
+	private Optimizer optimizer;
+	private long accessCount = 0;
+
+	public String getTableName() {
+		return tableName;
+	}
+
+	public String getSegmentColumnName() {
+		return segmentColumnName;
+	}
+
+	public String getSegmentValue() {
+		return segmentValue;
+	}
+
+	public int getSegmentValueLength() {
+		return segmentValueLength;
+	}
+
+	public String getValueColumnName() {
+		return valueColumnName;
+	}
+
+	public Type getIdentifierType() {
+		return identifierType;
+	}
+
+	public int getInitialValue() {
+		return initialValue;
+	}
+
+	public int getIncrementSize() {
+		return incrementSize;
+	}
+
+	public Optimizer getOptimizer() {
+		return optimizer;
+	}
+
+	public long getTableAccessCount() {
+		return accessCount;
+	}
+
+	public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
+		tableName = PropertiesHelper.getString( TABLE_PARAM, params, DEF_TABLE );
+		if ( tableName.indexOf( '.' ) < 0 ) {
+			String schemaName = params.getProperty( SCHEMA );
+			String catalogName = params.getProperty( CATALOG );
+			tableName = Table.qualify( catalogName, schemaName, tableName );
+		}
+
+		segmentColumnName = PropertiesHelper.getString( SEGMENT_COLUMN_PARAM, params, DEF_SEGMENT_COLUMN );
+		segmentValue = params.getProperty( SEGMENT_VALUE_PARAM );
+		if ( StringHelper.isEmpty( segmentValue ) ) {
+			log.debug( "explicit segment value for id generator [" + tableName + '.' + segmentColumnName + "] suggested; using default [" + DEF_SEGMENT_VALUE + "]" );
+			segmentValue = DEF_SEGMENT_VALUE;
+		}
+		segmentValueLength = PropertiesHelper.getInt( SEGMENT_LENGTH_PARAM, params, DEF_SEGMENT_LENGTH );
+		valueColumnName = PropertiesHelper.getString( VALUE_COLUMN_PARAM, params, DEF_VALUE_COLUMN );
+		initialValue = PropertiesHelper.getInt( INITIAL_PARAM, params, DEFAULT_INITIAL_VALUE );
+		incrementSize = PropertiesHelper.getInt( INCREMENT_PARAM, params, DEFAULT_INCREMENT_SIZE );
+		identifierType = type;
+
+		String query = "select " + valueColumnName +
+				" from " + tableName + " tbl" +
+				" where tbl." + segmentColumnName + "=?";
+		HashMap lockMap = new HashMap();
+		lockMap.put( "tbl", LockMode.UPGRADE );
+		this.query = dialect.applyLocksToSql( query, lockMap, CollectionHelper.EMPTY_MAP );
+
+		update = "update " + tableName +
+				" set " + valueColumnName + "=? " +
+				" where " + valueColumnName + "=? and " + segmentColumnName + "=?";
+
+		insert = "insert into " + tableName + " (" + segmentColumnName + ", " + valueColumnName + ") " + " values (?,?)";
+
+		String defOptStrategy = incrementSize <= 1 ? OptimizerFactory.NONE : OptimizerFactory.POOL;
+		String optimizationStrategy = PropertiesHelper.getString( OPT_PARAM, params, defOptStrategy );
+		optimizer = OptimizerFactory.buildOptimizer( optimizationStrategy, identifierType.getReturnedClass(), incrementSize );
+	}
+
+	public synchronized Serializable generate(final SessionImplementor session, Object obj) {
+		return optimizer.generate(
+				new AccessCallback() {
+					public long getNextValue() {
+						return ( ( Number ) doWorkInNewTransaction( session ) ).longValue();
+					}
+				}
+		);
+	}
+
+	public Serializable doWorkInCurrentTransaction(Connection conn, String sql) throws SQLException {
+		int result;
+		int rows;
+		do {
+			sql = query;
+			SQL.debug( sql );
+			PreparedStatement queryPS = conn.prepareStatement( query );
+			try {
+				queryPS.setString( 1, segmentValue );
+				ResultSet queryRS = queryPS.executeQuery();
+				if ( !queryRS.next() ) {
+					PreparedStatement insertPS = null;
+					try {
+						result = initialValue;
+						sql = insert;
+						SQL.debug( sql );
+						insertPS = conn.prepareStatement( insert );
+						insertPS.setString( 1, segmentValue );
+						insertPS.setLong( 2, result );
+						insertPS.execute();
+					}
+					finally {
+						if ( insertPS != null ) {
+							insertPS.close();
+						}
+					}
+				}
+				else {
+					result = queryRS.getInt( 1 );
+				}
+				queryRS.close();
+			}
+			catch ( SQLException sqle ) {
+				log.error( "could not read or init a hi value", sqle );
+				throw sqle;
+			}
+			finally {
+				queryPS.close();
+			}
+
+			sql = update;
+			SQL.debug( sql );
+			PreparedStatement updatePS = conn.prepareStatement( update );
+			try {
+				long newValue = optimizer.applyIncrementSizeToSourceValues()
+						? result + incrementSize : result + 1;
+				updatePS.setLong( 1, newValue );
+				updatePS.setLong( 2, result );
+				updatePS.setString( 3, segmentValue );
+				rows = updatePS.executeUpdate();
+			}
+			catch ( SQLException sqle ) {
+				log.error( "could not update hi value in: " + tableName, sqle );
+				throw sqle;
+			}
+			finally {
+				updatePS.close();
+			}
+		}
+		while ( rows == 0 );
+
+		accessCount++;
+
+		return new Integer( result );
+	}
+
+	public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
+		return new String[] {
+				new StringBuffer()
+						.append( dialect.getCreateTableString() )
+						.append( ' ' )
+						.append( tableName )
+						.append( " ( " )
+						.append( segmentColumnName )
+						.append( ' ' )
+						.append( dialect.getTypeName( Types.VARCHAR, segmentValueLength, 0, 0 ) )
+						.append( ",  " )
+						.append( valueColumnName )
+						.append( ' ' )
+						.append( dialect.getTypeName( Types.BIGINT ) )
+						.append( " ) " )
+						.toString()
+		};
+	}
+
+	public String[] sqlDropStrings(Dialect dialect) throws HibernateException {
+		StringBuffer sqlDropString = new StringBuffer().append( "drop table " );
+		if ( dialect.supportsIfExistsBeforeTableName() ) {
+			sqlDropString.append( "if exists " );
+		}
+		sqlDropString.append( tableName ).append( dialect.getCascadeConstraintsString() );
+		if ( dialect.supportsIfExistsAfterTableName() ) {
+			sqlDropString.append( " if exists" );
+		}
+		return new String[] { sqlDropString.toString() };
+	}
+
+	public Object generatorKey() {
+		return tableName;
+	}
+}

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/IdGenSuite.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/IdGenSuite.java	2007-03-21 02:54:23 UTC (rev 11325)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/IdGenSuite.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -3,14 +3,17 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.hibernate.test.idgen.enhanced.OptimizerUnitTest;
+import org.hibernate.test.idgen.enhanced.SequenceStyleConfigUnitTest;
+import org.hibernate.test.idgen.enhanced.forcedtable.BasicForcedTableSequenceTest;
+import org.hibernate.test.idgen.enhanced.forcedtable.HiLoForcedTableSequenceTest;
+import org.hibernate.test.idgen.enhanced.forcedtable.PooledForcedTableSequenceTest;
 import org.hibernate.test.idgen.enhanced.sequence.BasicSequenceTest;
 import org.hibernate.test.idgen.enhanced.sequence.HiLoSequenceTest;
 import org.hibernate.test.idgen.enhanced.sequence.PooledSequenceTest;
-import org.hibernate.test.idgen.enhanced.forcedtable.BasicTableTest;
-import org.hibernate.test.idgen.enhanced.forcedtable.HiLoTableTest;
-import org.hibernate.test.idgen.enhanced.forcedtable.PooledTableTest;
-import org.hibernate.test.idgen.enhanced.OptimizerUnitTest;
-import org.hibernate.test.idgen.enhanced.SequenceStyleConfigUnitTest;
+import org.hibernate.test.idgen.enhanced.table.BasicTableTest;
+import org.hibernate.test.idgen.enhanced.table.HiLoTableTest;
+import org.hibernate.test.idgen.enhanced.table.PooledTableTest;
 
 /**
  * {@inheritDoc}
@@ -19,15 +22,19 @@
  */
 public class IdGenSuite {
 	public static Test suite() {
-		TestSuite suite = new TestSuite( "id generators" );
+		TestSuite suite = new TestSuite( "enhanced id generators" );
 
 		suite.addTest( OptimizerUnitTest.suite() );
 		suite.addTest( SequenceStyleConfigUnitTest.suite() );
 
+		suite.addTest( BasicForcedTableSequenceTest.suite() );
+		suite.addTest( HiLoForcedTableSequenceTest.suite() );
+		suite.addTest( PooledForcedTableSequenceTest.suite() );
+
 		suite.addTest( BasicSequenceTest.suite() );
 		suite.addTest( HiLoSequenceTest.suite() );
 		suite.addTest( PooledSequenceTest.suite() );
-		
+
 		suite.addTest( BasicTableTest.suite() );
 		suite.addTest( HiLoTableTest.suite() );
 		suite.addTest( PooledTableTest.suite() );

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java (from rev 11323, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicTableTest.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,57 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BasicForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public BasicForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/Basic.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+
+		int count = 5;
+		Entity[] entities = new Entity[count];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( expectedId, generator.getDatabaseStructure().getTimesAccessed() );
+			assertEquals( expectedId, generator.getOptimizer().getLastSourceValue() );
+		}
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicTableTest.java	2007-03-21 02:54:23 UTC (rev 11325)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/BasicTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -1,57 +0,0 @@
-package org.hibernate.test.idgen.enhanced.forcedtable;
-
-import junit.framework.Test;
-
-import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.id.enhanced.SequenceStyleGenerator;
-import org.hibernate.Session;
-
-/**
- * {@inheritDoc}
- *
- * @author Steve Ebersole
- */
-public class BasicTableTest extends DatabaseSpecificFunctionalTestCase {
-	public BasicTableTest(String string) {
-		super( string );
-	}
-
-	public String[] getMappings() {
-		return new String[] { "idgen/enhanced/forcedtable/Basic.hbm.xml" };
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( BasicTableTest.class );
-	}
-
-	public void testNormalBoundary() {
-		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
-		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
-		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
-
-		int count = 5;
-		Entity[] entities = new Entity[count];
-		Session s = openSession();
-		s.beginTransaction();
-		for ( int i = 0; i < count; i++ ) {
-			entities[i] = new Entity( "" + ( i + 1 ) );
-			s.save( entities[i] );
-			long expectedId = i + 1;
-			assertEquals( expectedId, entities[i].getId().longValue() );
-			assertEquals( expectedId, generator.getDatabaseStructure().getTimesAccessed() );
-			assertEquals( expectedId, generator.getOptimizer().getLastSourceValue() );
-		}
-		s.getTransaction().commit();
-
-		s.beginTransaction();
-		for ( int i = 0; i < count; i++ ) {
-			assertEquals( i + 1, entities[i].getId().intValue() );
-			s.delete( entities[i] );
-		}
-		s.getTransaction().commit();
-		s.close();
-
-	}
-}

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java (from rev 11323, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoTableTest.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,69 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class HiLoForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public HiLoForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/HiLo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HiLoForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( 1, generator.getOptimizer().getLastSourceValue() );
+			assertEquals( i + 1, optimizer.getLastValue() );
+			assertEquals( increment + 1, optimizer.getHiValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		long expectedId = optimizer.getIncrementSize() + 1;
+		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
+		assertEquals( 2, optimizer.getLastSourceValue() ); // initialization + clokc-over
+		assertEquals( increment + 1, optimizer.getLastValue() );
+		assertEquals( ( increment * 2 ) + 1, optimizer.getHiValue() );
+
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoTableTest.java	2007-03-21 02:54:23 UTC (rev 11325)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/HiLoTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -1,69 +0,0 @@
-package org.hibernate.test.idgen.enhanced.forcedtable;
-
-import junit.framework.Test;
-
-import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.id.enhanced.OptimizerFactory;
-import org.hibernate.id.enhanced.SequenceStyleGenerator;
-import org.hibernate.Session;
-
-/**
- * {@inheritDoc}
- *
- * @author Steve Ebersole
- */
-public class HiLoTableTest extends DatabaseSpecificFunctionalTestCase {
-	public HiLoTableTest(String string) {
-		super( string );
-	}
-
-	public String[] getMappings() {
-		return new String[] { "idgen/enhanced/forcedtable/HiLo.hbm.xml" };
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( HiLoTableTest.class );
-	}
-
-	public void testNormalBoundary() {
-		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
-		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
-		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
-		assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
-		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
-
-		int increment = optimizer.getIncrementSize();
-		Entity[] entities = new Entity[ increment + 1 ];
-		Session s = openSession();
-		s.beginTransaction();
-		for ( int i = 0; i < increment; i++ ) {
-			entities[i] = new Entity( "" + ( i + 1 ) );
-			s.save( entities[i] );
-			long expectedId = i + 1;
-			assertEquals( expectedId, entities[i].getId().longValue() );
-			assertEquals( 1, generator.getOptimizer().getLastSourceValue() );
-			assertEquals( i + 1, optimizer.getLastValue() );
-			assertEquals( increment + 1, optimizer.getHiValue() );
-		}
-		// now force a "clock over"
-		entities[ increment ] = new Entity( "" + increment );
-		s.save( entities[ increment ] );
-		long expectedId = optimizer.getIncrementSize() + 1;
-		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
-		assertEquals( 2, optimizer.getLastSourceValue() ); // initialization + clokc-over
-		assertEquals( increment + 1, optimizer.getLastValue() );
-		assertEquals( ( increment * 2 ) + 1, optimizer.getHiValue() );
-
-		s.getTransaction().commit();
-
-		s.beginTransaction();
-		for ( int i = 0; i < entities.length; i++ ) {
-			assertEquals( i + 1, entities[i].getId().intValue() );
-			s.delete( entities[i] );
-		}
-		s.getTransaction().commit();
-		s.close();
-	}
-}

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java (from rev 11323, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledTableTest.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,69 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PooledForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public PooledForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/Pooled.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PooledForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( 2, generator.getDatabaseStructure().getTimesAccessed() ); // initialization calls table twice
+			assertEquals( increment + 1, optimizer.getLastSourceValue() ); // initialization calls table twice
+			assertEquals( i + 1, optimizer.getLastValue() );
+			assertEquals( increment + 1, optimizer.getLastSourceValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		long expectedId = optimizer.getIncrementSize() + 1;
+		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
+		assertEquals( 3, generator.getDatabaseStructure().getTimesAccessed() ); // initialization (2) + clock over
+		assertEquals( ( increment * 2 ) + 1, optimizer.getLastSourceValue() ); // initialization (2) + clock over
+		assertEquals( increment + 1, optimizer.getLastValue() );
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledTableTest.java	2007-03-21 02:54:23 UTC (rev 11325)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/forcedtable/PooledTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -1,69 +0,0 @@
-package org.hibernate.test.idgen.enhanced.forcedtable;
-
-import junit.framework.Test;
-
-import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.id.enhanced.OptimizerFactory;
-import org.hibernate.id.enhanced.SequenceStyleGenerator;
-import org.hibernate.Session;
-
-/**
- * {@inheritDoc}
- *
- * @author Steve Ebersole
- */
-public class PooledTableTest extends DatabaseSpecificFunctionalTestCase {
-	public PooledTableTest(String string) {
-		super( string );
-	}
-
-	public String[] getMappings() {
-		return new String[] { "idgen/enhanced/forcedtable/Pooled.hbm.xml" };
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( PooledTableTest.class );
-	}
-
-	public void testNormalBoundary() {
-		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
-		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
-		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
-		assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
-		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
-
-		int increment = optimizer.getIncrementSize();
-		Entity[] entities = new Entity[ increment + 1 ];
-		Session s = openSession();
-		s.beginTransaction();
-		for ( int i = 0; i < increment; i++ ) {
-			entities[i] = new Entity( "" + ( i + 1 ) );
-			s.save( entities[i] );
-			long expectedId = i + 1;
-			assertEquals( expectedId, entities[i].getId().longValue() );
-			assertEquals( 2, generator.getDatabaseStructure().getTimesAccessed() ); // initialization calls table twice
-			assertEquals( increment + 1, optimizer.getLastSourceValue() ); // initialization calls table twice
-			assertEquals( i + 1, optimizer.getLastValue() );
-			assertEquals( increment + 1, optimizer.getLastSourceValue() );
-		}
-		// now force a "clock over"
-		entities[ increment ] = new Entity( "" + increment );
-		s.save( entities[ increment ] );
-		long expectedId = optimizer.getIncrementSize() + 1;
-		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
-		assertEquals( 3, generator.getDatabaseStructure().getTimesAccessed() ); // initialization (2) + clock over
-		assertEquals( ( increment * 2 ) + 1, optimizer.getLastSourceValue() ); // initialization (2) + clock over
-		assertEquals( increment + 1, optimizer.getLastValue() );
-		s.getTransaction().commit();
-
-		s.beginTransaction();
-		for ( int i = 0; i < entities.length; i++ ) {
-			assertEquals( i + 1, entities[i].getId().intValue() );
-			s.delete( entities[i] );
-		}
-		s.getTransaction().commit();
-		s.close();
-	}
-}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!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.idgen.enhanced.table">
+
+    <class name="Entity" table="ID_TBL_BSC_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.TableGenerator">
+                <param name="table_name">ID_TBL_BSC_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">1</param>
+                <param name="optimizer">none</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,57 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BasicTableTest extends FunctionalTestCase {
+	public BasicTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/Basic.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+
+		int count = 5;
+		Entity[] entities = new Entity[count];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( expectedId, generator.getTableAccessCount() );
+			assertEquals( expectedId, generator.getOptimizer().getLastSourceValue() );
+		}
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Entity.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Entity.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Entity.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,34 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private Long id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!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.idgen.enhanced.table">
+
+    <class name="Entity" table="ID_TBL_HILO_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.TableGenerator">
+                <param name="table_name">ID_TBL_HILO_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">hilo</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,67 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class HiLoTableTest extends FunctionalTestCase {
+	public HiLoTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/HiLo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HiLoTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 1, generator.getTableAccessCount() ); // initialization
+			assertEquals( 1, optimizer.getLastSourceValue() ); // initialization
+			assertEquals( i + 1, optimizer.getLastValue() );
+			assertEquals( increment + 1, optimizer.getHiValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 2, generator.getTableAccessCount() ); // initialization
+		assertEquals( 2, optimizer.getLastSourceValue() ); // initialization
+		assertEquals( increment + 1, optimizer.getLastValue() );
+		assertEquals( ( increment * 2 ) + 1, optimizer.getHiValue() );
+
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, using a pooled algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.table">
+
+    <class name="Entity" table="ID_TBL_POOL_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.TableGenerator">
+                <param name="table_name">ID_TBL_POOL_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">pooled</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java	2007-03-21 02:54:45 UTC (rev 11326)
@@ -0,0 +1,65 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PooledTableTest extends FunctionalTestCase {
+	public PooledTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/Pooled.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PooledTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 2, generator.getTableAccessCount() ); // initialization calls seq twice
+			assertEquals( increment + 1, optimizer.getLastSourceValue() ); // initialization calls seq twice
+			assertEquals( i + 1, optimizer.getLastValue() );
+			assertEquals( increment + 1, optimizer.getLastSourceValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 3, generator.getTableAccessCount() ); // initialization (2) + clock over
+		assertEquals( ( increment * 2 ) + 1, optimizer.getLastSourceValue() ); // initialization (2) + clock over
+		assertEquals( increment + 1, optimizer.getLastValue() );
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}




More information about the hibernate-commits mailing list