Author: arminw Date: Thu Mar 1 16:55:32 2007 New Revision: 513566 URL: http://svn.apache.org/viewvc?view=rev&rev=513566 Log: SequenceManager changes to support of Statement.getGeneratedKeys() in database identity column based sequence manager
Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/AbstractSequenceManager.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/PerFieldManager.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManager.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerHighLowImpl.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/AbstractSequenceManager.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/AbstractSequenceManager.java?view=diff&rev=513566&r1=513565&r2=513566 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/AbstractSequenceManager.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/AbstractSequenceManager.java Thu Mar 1 16:55:32 2007 @@ -16,6 +16,7 @@ */ import java.util.Properties; +import java.sql.Statement; import org.apache.ojb.broker.PersistenceBroker; import org.apache.ojb.broker.accesslayer.JdbcAccess; @@ -165,5 +166,14 @@ throws SequenceManagerException { // do nothing + } + + /** + * NOTE: For backward compatibility with older sequence manager implementations, this method calls deprecated method + * [EMAIL PROTECTED] #afterStore(org.apache.ojb.broker.accesslayer.JdbcAccess, org.apache.ojb.broker.metadata.ClassDescriptor, Object)}. + */ + public void afterStore(JdbcAccess dbAccess, Statement stmt, ClassDescriptor cld, Object obj) throws SequenceManagerException + { + afterStore(dbAccess, cld, obj); } } Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/PerFieldManager.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/PerFieldManager.java?view=diff&rev=513566&r1=513565&r2=513566 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/PerFieldManager.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/PerFieldManager.java Thu Mar 1 16:55:32 2007 @@ -17,6 +17,7 @@ import java.lang.Object; import java.util.Map; +import java.sql.Statement; import org.apache.ojb.broker.util.logging.Logger; import org.apache.ojb.broker.util.logging.LoggerFactory; @@ -76,7 +77,7 @@ this.defaultManager = defaultManager; } - public Object getUniqueValue(FieldDescriptor field) throws SequenceManagerException + public Object getUniqueValue(final FieldDescriptor field) throws SequenceManagerException { SequenceManager sm = lookup(field); return sm.getUniqueValue(field); @@ -84,6 +85,11 @@ public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object obj) throws SequenceManagerException { + // noop + } + + public void afterStore(final JdbcAccess dbAccess, final Statement stmt, final ClassDescriptor cld, final Object obj) throws SequenceManagerException + { FieldDescriptor[] pks = cld.getAutoIncrementFields(); FieldDescriptor result; for(int i = 0; i < pks.length; i++) @@ -92,7 +98,7 @@ SequenceManager sm = lookup(result); if(sm != null) { - sm.afterStore(dbAccess, cld, obj); + sm.afterStore(dbAccess, stmt, cld, obj); } } } Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManager.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManager.java?view=diff&rev=513566&r1=513565&r2=513566 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManager.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManager.java Thu Mar 1 16:55:32 2007 @@ -15,6 +15,8 @@ * limitations under the License. */ +import java.sql.Statement; + import org.apache.ojb.broker.accesslayer.JdbcAccess; import org.apache.ojb.broker.metadata.ClassDescriptor; import org.apache.ojb.broker.metadata.FieldDescriptor; @@ -62,6 +64,20 @@ * @param dbAccess Current used [EMAIL PROTECTED] org.apache.ojb.broker.accesslayer.JdbcAccess} instance * @param cld Descriptor for specified object * @param obj The object to associate with identity value + * @deprecated */ public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object obj) throws SequenceManagerException; + + /** + * This method is called <strong>after</strong> the object was written to the persistent storage. + * <br/> + * This is to support native Identity columns (auto_increment columns) on the db side. + * Other implementations may ignore this method. + * @param dbAccess The current used [EMAIL PROTECTED] org.apache.ojb.broker.accesslayer.JdbcAccess} instance. + * @param stmt The current executed [EMAIL PROTECTED] Statement}. + * @param cld Descriptor for specified object. + * @param obj The object to associate with identity value. + */ + public void afterStore(JdbcAccess dbAccess, Statement stmt, ClassDescriptor cld, Object obj) + throws SequenceManagerException; } Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerHighLowImpl.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerHighLowImpl.java?view=diff&rev=513566&r1=513565&r2=513566 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerHighLowImpl.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerHighLowImpl.java Thu Mar 1 16:55:32 2007 @@ -19,6 +19,7 @@ import java.util.Map; import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang.BooleanUtils; import org.apache.ojb.broker.Identity; import org.apache.ojb.broker.OptimisticLockException; import org.apache.ojb.broker.PersistenceBroker; @@ -51,7 +52,7 @@ * </td> * </tr> * <tr> - * <td>grabSize</td> + * <td>seq.grabSize</td> * <td> * Integer entry determines the * number of IDs allocated within the @@ -60,6 +61,15 @@ * </td> * </tr> * <tr> + * <td>grabSize</td> + * <td> + * DEPRECATED. Integer entry determines the + * number of IDs allocated within the + * H/L sequence manager implementation. + * Default was '20'. + * </td> + * </tr> + * <tr> * <td>seq.autoNaming</td> * <td> * Default was 'true'. If set 'true' OJB try to build a @@ -167,7 +177,7 @@ grabSizeStr = getConfigurationProperty(PROPERTY_GRAB_SIZE_OLD, "20"); } grabSize = Integer.parseInt(grabSizeStr); - useGlobalSequenceIdentities = Boolean.getBoolean(getConfigurationProperty(PROPERTY_GLOBAL_SEQUENCE_ID, "false")); + useGlobalSequenceIdentities = BooleanUtils.toBoolean(getConfigurationProperty(PROPERTY_GLOBAL_SEQUENCE_ID, "false")); // support for deprecated properties long globalSequenceStart = Long.parseLong(getConfigurationProperty(PROPERTY_GLOBAL_SEQUENCE_START, "1")); if(useGlobalSequenceIdentities && globalSequenceStart > sequenceStart) Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java?view=diff&rev=513566&r1=513565&r2=513566 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java Thu Mar 1 16:55:32 2007 @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.lang.BooleanUtils; import org.apache.ojb.broker.PersistenceBroker; import org.apache.ojb.broker.accesslayer.JdbcAccess; import org.apache.ojb.broker.metadata.SequenceDescriptor; @@ -52,10 +53,12 @@ * <td><strong>Property Values</strong></td> * </tr> * <tr> - * <td>no properties to set</td> - * <td> - * <p/> - * </td> + * <td>seq.generatedKeys</td> + * <td> + * If set <em>true</em> OJB use JDBC 3.0 method <em>Statement.getGeneratedKeys()</em> + * to obtain generated database identity keys. If set <em>false</em> OJB use a separate + * database specific <em>"last identity call"</em> query to request the generated identity key. + * </td> * </tr> * </table> * </p> @@ -81,6 +84,9 @@ { private Log log = LogFactory.getLog(SequenceManagerIdentityImpl.class); + public static final String PROPERTY_USE_GENERATED_KEYS = "seq.generatedKeys"; + private boolean useGeneratedKeys; + /* TODO: 1. Find a better solution (if possible) for this problem @@ -99,14 +105,21 @@ public SequenceManagerIdentityImpl(PersistenceBroker broker) { super(broker); + init(); } public SequenceManagerIdentityImpl(PersistenceBroker broker, SequenceDescriptor descriptor) { super(broker, descriptor); + init(); + } + + void init() + { + useGeneratedKeys = BooleanUtils.toBoolean(getConfigurationProperty(PROPERTY_USE_GENERATED_KEYS, "true")); } - public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object obj) throws SequenceManagerException + public void afterStore(JdbcAccess dbAccess, Statement stmt, ClassDescriptor cld, Object obj) throws SequenceManagerException { FieldDescriptor identityField = extractIdentityColumnField(cld); if(identityField != null) @@ -115,8 +128,26 @@ // thus we have to execute batch entries before getBrokerForClass().serviceConnectionManager().executeBatch(); ifNotReadOnlyFail(identityField); - long newId = getLastInsert(cld, identityField); - setFieldValue(obj, identityField, new Long(newId)); + Object val; + if(useGeneratedKeys && getPlatform().supportsGetGeneratedKeys()) + { + try + { + ResultSet result = getPlatform().getGeneratedKeys(stmt); + result.next(); + val = identityField.getJdbcType().getObjectFromColumn(result, 1); + val = identityField.getFieldConversion().sqlToJava(val); + } + catch(SQLException e) + { + throw new SequenceManagerException("Error while extract generated keys from statement", e); + } + } + else + { + val = new Long(getLastInsert(cld, identityField)); + } + setFieldValue(obj, identityField, val); } } @@ -205,9 +236,17 @@ getSupportedPlatform().getLastInsertIdentityQuery(tableName); } - private void setFieldValue(Object obj, FieldDescriptor field, Long identifier) throws SequenceManagerException + private void setFieldValue(Object obj, FieldDescriptor field, Object identifier) throws SequenceManagerException { - Object result = field.getJdbcType().sequenceKeyConversion(identifier); + Object result; + if(identifier instanceof Long) + { + result= field.getJdbcType().sequenceKeyConversion((Long)identifier); + } + else + { + result = identifier; + } result = field.getFieldConversion().sqlToJava(result); PersistentField pf = field.getPersistentField(); pf.set(obj, result); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]