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]