From: <hib...@li...> - 2006-03-22 17:39:04
|
Author: ste...@jb... Date: 2006-03-22 12:38:55 -0500 (Wed, 22 Mar 2006) New Revision: 9676 Modified: trunk/Hibernate3/src/org/hibernate/dialect/Oracle9Dialect.java trunk/Hibernate3/src/org/hibernate/jdbc/AbstractBatcher.java trunk/Hibernate3/src/org/hibernate/jdbc/Batcher.java trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java trunk/Hibernate3/src/org/hibernate/util/GetGeneratedKeysHelper.java Log: rollback HHH-1160 (getGeneratedKeys passing in pkColumnNames) in favor of HHH-1590 Modified: trunk/Hibernate3/src/org/hibernate/dialect/Oracle9Dialect.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/dialect/Oracle9Dialect.java 2006-03-22 17:34:59 UTC (rev 9675) +++ trunk/Hibernate3/src/org/hibernate/dialect/Oracle9Dialect.java 2006-03-22 17:38:55 UTC (rev 9676) @@ -46,6 +46,11 @@ registerColumnType( Types.BLOB, "blob" ); registerColumnType( Types.CLOB, "clob" ); + // Oracle driver reports to support getGeneratedKeys(), but they only + // support the version taking an array of the names of the columns to + // be returned (via its RETURNING clause). No other driver seems to + // support this overloaded version. + getDefaultProperties().setProperty(Environment.USE_GET_GENERATED_KEYS, "false"); getDefaultProperties().setProperty(Environment.USE_STREAMS_FOR_BINARY, "true"); getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE); Modified: trunk/Hibernate3/src/org/hibernate/jdbc/AbstractBatcher.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/jdbc/AbstractBatcher.java 2006-03-22 17:34:59 UTC (rev 9675) +++ trunk/Hibernate3/src/org/hibernate/jdbc/AbstractBatcher.java 2006-03-22 17:38:55 UTC (rev 9676) @@ -83,41 +83,69 @@ public PreparedStatement prepareStatement(String sql) throws SQLException, HibernateException { - return prepareStatement( sql, false, null ); + return prepareStatement( sql, false ); } - public PreparedStatement prepareStatement(String sql, boolean getGeneratedKeys, String[] pkColumnNames) - throws SQLException, HibernateException { + public PreparedStatement prepareStatement(String sql, boolean getGeneratedKeys) + throws SQLException, HibernateException { executeBatch(); logOpenPreparedStatement(); - return getPreparedStatement( connectionManager.getConnection(), sql, false, getGeneratedKeys, pkColumnNames, null, false ); + return getPreparedStatement( + connectionManager.getConnection(), + sql, + false, + getGeneratedKeys, + null, + false + ); } - public PreparedStatement prepareSelectStatement(String sql) - throws SQLException, HibernateException { + public PreparedStatement prepareSelectStatement(String sql) + throws SQLException, HibernateException { logOpenPreparedStatement(); - return getPreparedStatement( connectionManager.getConnection(), sql, false, false, null, null, false ); + return getPreparedStatement( + connectionManager.getConnection(), + sql, + false, + false, + null, + false + ); } - public PreparedStatement prepareQueryStatement(String sql, boolean scrollable, ScrollMode scrollMode) - throws SQLException, HibernateException { + public PreparedStatement prepareQueryStatement( + String sql, + boolean scrollable, + ScrollMode scrollMode) throws SQLException, HibernateException { logOpenPreparedStatement(); - PreparedStatement ps = getPreparedStatement( connectionManager.getConnection(), sql, scrollable, scrollMode ); - setStatementFetchSize(ps); - statementsToClose.add(ps); - lastQuery=ps; + PreparedStatement ps = getPreparedStatement( + connectionManager.getConnection(), + sql, + scrollable, + scrollMode + ); + setStatementFetchSize( ps ); + statementsToClose.add( ps ); + lastQuery = ps; return ps; } - public CallableStatement prepareCallableQueryStatement(String sql, boolean scrollable, ScrollMode scrollMode) - throws SQLException, HibernateException { + public CallableStatement prepareCallableQueryStatement( + String sql, + boolean scrollable, + ScrollMode scrollMode) throws SQLException, HibernateException { logOpenPreparedStatement(); - CallableStatement ps = (CallableStatement) getPreparedStatement( - connectionManager.getConnection(), sql, scrollable, false, null, scrollMode, true + CallableStatement ps = ( CallableStatement ) getPreparedStatement( + connectionManager.getConnection(), + sql, + scrollable, + false, + scrollMode, + true ); - setStatementFetchSize(ps); - statementsToClose.add(ps); - lastQuery=ps; + setStatementFetchSize( ps ); + statementsToClose.add( ps ); + lastQuery = ps; return ps; } @@ -163,8 +191,8 @@ } } - public PreparedStatement prepareBatchStatement(String sql) - throws SQLException, HibernateException { + public PreparedStatement prepareBatchStatement(String sql) + throws SQLException, HibernateException { sql = getSQL( sql ); if ( !sql.equals(batchUpdateSQL) ) { @@ -178,8 +206,8 @@ return batchUpdate; } - public CallableStatement prepareBatchCallableStatement(String sql) - throws SQLException, HibernateException { + public CallableStatement prepareBatchCallableStatement(String sql) + throws SQLException, HibernateException { if ( !sql.equals(batchUpdateSQL) ) { // TODO: what if batchUpdate is a callablestatement ? batchUpdate=prepareCallableStatement(sql); // calls executeBatch() batchUpdateSQL=sql; @@ -365,36 +393,44 @@ final boolean scrollable, final ScrollMode scrollMode) throws SQLException { - return getPreparedStatement(conn, sql, scrollable, false, null, scrollMode, false); + return getPreparedStatement( + conn, + sql, + scrollable, + false, + scrollMode, + false + ); } - private CallableStatement getCallableStatement( final Connection conn, + private CallableStatement getCallableStatement( + final Connection conn, String sql, - boolean scrollable) - throws SQLException { - + boolean scrollable) throws SQLException { if ( scrollable && !factory.getSettings().isScrollableResultSetsEnabled() ) { throw new AssertionFailure("scrollable result sets are not enabled"); } sql = getSQL( sql ); + log( sql ); - log(sql); - log.trace("preparing callable statement"); - if (scrollable) { - return conn.prepareCall(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + if ( scrollable ) { + return conn.prepareCall( + sql, + ResultSet.TYPE_SCROLL_INSENSITIVE, + ResultSet.CONCUR_READ_ONLY + ); } else { - return conn.prepareCall(sql); + return conn.prepareCall( sql ); } - } private String getSQL(String sql) { - sql = interceptor.onPrepareStatement(sql); - if(sql==null || sql.length()==0) { - throw new AssertionFailure("Interceptor.onPrepareStatement() returned null or empty string."); + sql = interceptor.onPrepareStatement( sql ); + if ( sql==null || sql.length() == 0 ) { + throw new AssertionFailure( "Interceptor.onPrepareStatement() returned null or empty string." ); } return sql; } @@ -404,42 +440,37 @@ String sql, boolean scrollable, final boolean useGetGeneratedKeys, - final String[] pkColumnNames, final ScrollMode scrollMode, - final boolean callable) - throws SQLException { - + final boolean callable) throws SQLException { if ( scrollable && !factory.getSettings().isScrollableResultSetsEnabled() ) { throw new AssertionFailure("scrollable result sets are not enabled"); } - if ( useGetGeneratedKeys && !factory.getSettings().isGetGeneratedKeysEnabled() ) { throw new AssertionFailure("getGeneratedKeys() support is not enabled"); } sql = getSQL( sql ); - - log(sql); + log( sql ); - log.trace("preparing statement"); + log.trace( "preparing statement" ); PreparedStatement result; - if (scrollable) { - if (callable) { + if ( scrollable ) { + if ( callable ) { result = conn.prepareCall( sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY ); } else { result = conn.prepareStatement( sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY ); } } - else if (useGetGeneratedKeys) { - result = GetGeneratedKeysHelper.prepareStatement( conn, sql, pkColumnNames ); + else if ( useGetGeneratedKeys ) { + result = GetGeneratedKeysHelper.prepareStatement( conn, sql ); } else { - if (callable) { - result = conn.prepareCall(sql); + if ( callable ) { + result = conn.prepareCall( sql ); } else { - result = conn.prepareStatement(sql); + result = conn.prepareStatement( sql ); } } Modified: trunk/Hibernate3/src/org/hibernate/jdbc/Batcher.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/jdbc/Batcher.java 2006-03-22 17:34:59 UTC (rev 9675) +++ trunk/Hibernate3/src/org/hibernate/jdbc/Batcher.java 2006-03-22 17:38:55 UTC (rev 9676) @@ -50,7 +50,7 @@ * Get a non-batchable prepared statement to use for inserting / deleting / updating. * Must be explicitly released by <tt>closeStatement()</tt> */ - public PreparedStatement prepareStatement(String sql, boolean useGetGeneratedKeys, String[] keyColumnNames) throws SQLException, HibernateException; + public PreparedStatement prepareStatement(String sql, boolean useGetGeneratedKeys) throws SQLException, HibernateException; /** * Get a non-batchable prepared statement to use for inserting / deleting / updating. * Must be explicitly released by <tt>closeStatement()</tt> Modified: trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-22 17:34:59 UTC (rev 9675) +++ trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-22 17:38:55 UTC (rev 9676) @@ -2084,7 +2084,7 @@ try { //do the insert - PreparedStatement insert = session.getBatcher().prepareStatement( sql, useGetGeneratedKeys(), getKeyColumnNames() ); + PreparedStatement insert = session.getBatcher().prepareStatement( sql, useGetGeneratedKeys() ); try { dehydrate( null, fields, notNull, propertyColumnInsertable, 0, insert, session ); Modified: trunk/Hibernate3/src/org/hibernate/util/GetGeneratedKeysHelper.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/util/GetGeneratedKeysHelper.java 2006-03-22 17:34:59 UTC (rev 9675) +++ trunk/Hibernate3/src/org/hibernate/util/GetGeneratedKeysHelper.java 2006-03-22 17:38:55 UTC (rev 9676) @@ -19,14 +19,19 @@ private GetGeneratedKeysHelper() { } + private static final Integer RETURN_GENERATED_KEYS; private static final Method PREPARE_STATEMENT_METHOD; private static final Method GET_GENERATED_KEYS_METHOD; static { try { + int returnGeneratedKeysEnumValue = Statement.class + .getDeclaredField( "RETURN_GENERATED_KEYS" ) + .getInt( PreparedStatement.class ); + RETURN_GENERATED_KEYS = new Integer( returnGeneratedKeysEnumValue ); PREPARE_STATEMENT_METHOD = Connection.class.getMethod( "prepareStatement", - new Class[] { String.class, String[].class } + new Class[] { String.class, Integer.TYPE } ); GET_GENERATED_KEYS_METHOD = Statement.class.getDeclaredMethod( "getGeneratedKeys", @@ -38,9 +43,8 @@ } } - public static PreparedStatement prepareStatement(Connection conn, String sql, String[] pkColumnNames) - throws SQLException { - Object[] args = new Object[] {sql, pkColumnNames}; + public static PreparedStatement prepareStatement(Connection conn, String sql) throws SQLException { + Object[] args = new Object[] { sql, RETURN_GENERATED_KEYS } ; try { return ( PreparedStatement ) PREPARE_STATEMENT_METHOD.invoke( conn, args ); } |