[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