Author: arminw
Date: Fri Oct 13 09:56:15 2006
New Revision: 463736
URL: http://svn.apache.org/viewvc?view=rev&rev=463736
Log:
declare deprecated, renamed to SequenceManagerIdentityImpl
Added:
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/SequenceManagerNativeImpl.java
Added:
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=auto&rev=463736
==============================================================================
---
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java
(added)
+++
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerIdentityImpl.java
Fri Oct 13 09:56:15 2006
@@ -0,0 +1,229 @@
+package org.apache.ojb.broker.util.sequence;
+
+/* Copyright 2002-2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.lang.Object;
+import java.sql.Statement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ojb.broker.PersistenceBroker;
+import org.apache.ojb.broker.accesslayer.JdbcAccess;
+import org.apache.ojb.broker.metadata.SequenceDescriptor;
+import org.apache.ojb.broker.metadata.ClassDescriptor;
+import org.apache.ojb.broker.metadata.FieldDescriptor;
+import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
+
+/**
+ * Sequence manager implementation using native database <tt>Identity
columns</tt>
+ * (like MySQL, MSSQL, ...). For proper work some specific metadata settings
+ * needed:
+ * <ul>
+ * <li>field representing the identity column need attribute
<code>autoincrement</code> 'true'</li>
+ * <li>field representing the identity column need attribute
<code>access</code> set 'readonly'</li>
+ * <li>field representing the identity column need attribute
<code>primarykey</code> set 'true'</li>
+ * <li>only possible to declare one identity field per class</li>
+ * </ul>
+ * <p/>
+ * <b>Note:</b>
+ * Make sure that the DB generated identity columns represent values > 0,
because negative values
+ * intern used by this implementation and 0 could cause problems with
primitive FK fields.
+ * </p>
+ * <p/>
+ * Implementation configuration properties:
+ * <table cellspacing="2" cellpadding="2" border="3" frame="box">
+ * <tr>
+ * <td><strong>Property Key</strong></td>
+ * <td><strong>Property Values</strong></td>
+ * </tr>
+ * <tr>
+ * <td>no properties to set</td>
+ * <td>
+ * <p/>
+ * </td>
+ * </tr>
+ * </table>
+ * </p>
+ * <p/>
+ * <p/>
+ * <b>Limitations:</b>
+ * <ul>
+ * <li>Native key generation is not 'extent aware'
+ * when extent classes span several tables! Please
+ * see more in shipped docs 'extents and polymorphism'
+ * or sequence manager docs.
+ * </li>
+ * <li>
+ * Only positive identity values are allowed (see above).
+ * </li>
+ * </ul>
+ * </p>
+ * <br/>
+ *
+ * @version $Id: SequenceManagerIdentityImpl.java 432648 2006-08-18 19:18:37
+0200 (Fr, 18 Aug 2006) arminw $
+ */
+public class SequenceManagerIdentityImpl extends AbstractSequenceManager
+{
+ private Log log = LogFactory.getLog(SequenceManagerIdentityImpl.class);
+
+ /*
+ TODO:
+ 1. Find a better solution (if possible) for this problem
+ We need this dummy field to return a negative long value
+ on getUniqueLong(...) call. If we return always the same
+ value, the resulting Identity object was found on cache.
+
+ 2. Problem is that generated oid (by Identity column)
+ must not begin with 0.
+
+ Use keyword 'volatile' to make decrement of a long value an
+ atomic operation
+ */
+ private static volatile long tempKey = -1;
+
+ /**
+ * @deprecated
+ */
+ public SequenceManagerIdentityImpl(PersistenceBroker broker)
+ {
+ super(broker);
+ }
+
+ public SequenceManagerIdentityImpl(PersistenceBroker broker,
SequenceDescriptor descriptor)
+ {
+ super(broker, descriptor);
+ }
+
+ public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object
obj) throws SequenceManagerException
+ {
+ FieldDescriptor identityField = extractIdentityColumnField(cld);
+ if(identityField != null)
+ {
+ ifNotReadOnlyFail(identityField);
+ long newId = getLastInsert(cld, identityField);
+ setFieldValue(obj, identityField, new Long(newId));
+ }
+ }
+
+ /**
+ * Gets the identity column descriptor for the given class
+ * or return <code>null</code> if none defined.
+ *
+ * @param cld The class descriptor
+ * @return The class's identity column or <code>null</code> if it does not
have one
+ */
+ private FieldDescriptor extractIdentityColumnField(ClassDescriptor cld)
+ {
+ FieldDescriptor[] pkFields = cld.getPkFields();
+ for(int i = 0; i < pkFields.length; i++)
+ {
+ // to find the identity column we search for a autoincrement
+ // read-only field
+ if(pkFields[i].isAutoIncrement() && pkFields[i].isAccessReadOnly())
+ {
+ return pkFields[i];
+ }
+ }
+ return null;
+ }
+
+ private void ifNotReadOnlyFail(FieldDescriptor field) throws
SequenceManagerException
+ {
+ // is field declared as read-only?
+ if(!field.isAccessReadOnly())
+ {
+ throw new SequenceManagerException("Can't find Identity column:
Identity columns/fields need to be declared as" +
+ " 'autoincrement' with 'readonly' access in
field-descriptor");
+ }
+ }
+
+ private long getLastInsert(ClassDescriptor cld, FieldDescriptor field)
throws SequenceManagerException
+ {
+ long newId = 0;
+ Statement stmt = null;
+ if(field != null)
+ { // an autoinc column exists
+ try
+ {
+ stmt =
getBrokerForClass().serviceConnectionManager().getConnection().createStatement();
+ ResultSet rs =
stmt.executeQuery(lastInsertSelect(cld.getFullTableName()));
+ if(!rs.next())
+ {
+ throw new SequenceManagerException("Could not find native
identifier");
+ }
+ newId = rs.getLong(1);
+ rs.close();
+ if(log.isDebugEnabled()) log.debug("After store - newid=" +
newId);
+ }
+ catch(Exception e)
+ {
+ throw new SequenceManagerException(
+ "Error while execute query: " +
lastInsertSelect(cld.getFullTableName()), e);
+ }
+ finally
+ {
+ try
+ {
+ if(stmt != null) stmt.close();
+ }
+ catch(SQLException e)
+ {
+ if(log.isDebugEnabled())
+ log.debug("Threw SQLException while in getLastInsert
and closing stmt", e);
+ // ignore it
+ }
+ }
+ }
+ else
+ {
+ throw new SequenceManagerException("No autoincrement field
declared, please check repository for " + cld);
+ }
+ return newId;
+ }
+
+ /*
+ * query for the last insert id.
+ */
+ protected String lastInsertSelect(String tableName)
+ {
+ return getBrokerForClass().serviceConnectionManager().
+ getSupportedPlatform().getLastInsertIdentityQuery(tableName);
+ }
+
+ private void setFieldValue(Object obj, FieldDescriptor field, Long
identifier) throws SequenceManagerException
+ {
+ Object result = field.getJdbcType().sequenceKeyConversion(identifier);
+ result = field.getFieldConversion().sqlToJava(result);
+ PersistentField pf = field.getPersistentField();
+ pf.set(obj, result);
+ }
+
+ /**
+ * returns a negative value
+ */
+ protected long getUniqueLong(FieldDescriptor field) throws
SequenceManagerException
+ {
+ /*
+ arminw:
+ workaround for locking problems of new objects
+ We need unique 'dummy keys' for new objects before storing.
+ Variable 'tempKey' is declared volatile, thus decrement should be
atomic
+ */
+ return --tempKey;
+ }
+}
Modified:
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerNativeImpl.java
URL:
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerNativeImpl.java?view=diff&rev=463736&r1=463735&r2=463736
==============================================================================
---
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerNativeImpl.java
(original)
+++
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/sequence/SequenceManagerNativeImpl.java
Fri Oct 13 09:56:15 2006
@@ -25,6 +25,7 @@
import org.apache.ojb.broker.accesslayer.JdbcAccess;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.metadata.FieldDescriptor;
+import org.apache.ojb.broker.metadata.SequenceDescriptor;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
@@ -73,151 +74,19 @@
* </ul>
* </p>
* <br/>
- * <br/>
*
- * @author <a href="mailto:[EMAIL PROTECTED]">Travis Reeder</a>
- * @author <a href="mailto:[EMAIL PROTECTED]">Armin Waibel</a>
+ * @deprecated please use [EMAIL PROTECTED] SequenceManagerIdentityImpl}
instead.
* @version $Id$
*/
-public class SequenceManagerNativeImpl extends AbstractSequenceManager
+public class SequenceManagerNativeImpl extends SequenceManagerIdentityImpl
{
- private Log log = LogFactory.getLog(SequenceManagerNativeImpl.class);
-
- /*
- TODO:
- 1. Find a better solution (if possible) for this problem
- We need this dummy field to return a negative long value
- on getUniqueLong(...) call. If we return always the same
- value, the resulting Identity object was found on cache.
-
- 2. Problem is that generated oid (by Identity column)
- must not begin with 0.
-
- Use keyword 'volatile' to make decrement of a long value an
- atomic operation
- */
- private static volatile long tempKey = -1;
-
public SequenceManagerNativeImpl(PersistenceBroker broker)
{
super(broker);
}
- public void afterStore(JdbcAccess dbAccess, ClassDescriptor cld, Object
obj) throws SequenceManagerException
- {
- FieldDescriptor identityField = extractIdentityColumnField(cld);
- if(identityField != null)
- {
- ifNotReadOnlyFail(identityField);
- long newId = getLastInsert(cld, identityField);
- setFieldValue(obj, identityField, new Long(newId));
- }
- }
-
- /**
- * Gets the identity column descriptor for the given class
- * or return <code>null</code> if none defined.
- *
- * @param cld The class descriptor
- * @return The class's identity column or <code>null</code> if it does not
have one
- */
- private FieldDescriptor extractIdentityColumnField(ClassDescriptor cld)
- {
- FieldDescriptor[] pkFields = cld.getPkFields();
- for(int i = 0; i < pkFields.length; i++)
- {
- // to find the identity column we search for a autoincrement
- // read-only field
- if(pkFields[i].isAutoIncrement() && pkFields[i].isAccessReadOnly())
- {
- return pkFields[i];
- }
- }
- return null;
- }
-
- private void ifNotReadOnlyFail(FieldDescriptor field) throws
SequenceManagerException
- {
- // is field declared as read-only?
- if(!field.isAccessReadOnly())
- {
- throw new SequenceManagerException("Can't find Identity column:
Identity columns/fields need to be declared as" +
- " 'autoincrement' with 'readonly' access in
field-descriptor");
- }
- }
-
- private long getLastInsert(ClassDescriptor cld, FieldDescriptor field)
throws SequenceManagerException
- {
- long newId = 0;
- Statement stmt = null;
- if(field != null)
- { // an autoinc column exists
- try
- {
- stmt =
getBrokerForClass().serviceConnectionManager().getConnection().createStatement();
- ResultSet rs =
stmt.executeQuery(lastInsertSelect(cld.getFullTableName()));
- if(!rs.next())
- {
- throw new SequenceManagerException("Could not find native
identifier");
- }
- newId = rs.getLong(1);
- rs.close();
- if(log.isDebugEnabled()) log.debug("After store - newid=" +
newId);
- }
- catch(Exception e)
- {
- throw new SequenceManagerException(
- "Error while execute query: " +
lastInsertSelect(cld.getFullTableName()), e);
- }
- finally
- {
- try
- {
- if(stmt != null) stmt.close();
- }
- catch(SQLException e)
- {
- if(log.isDebugEnabled())
- log.debug("Threw SQLException while in getLastInsert
and closing stmt", e);
- // ignore it
- }
- }
- }
- else
- {
- throw new SequenceManagerException("No autoincrement field
declared, please check repository for " + cld);
- }
- return newId;
- }
-
- /*
- * query for the last insert id.
- */
- protected String lastInsertSelect(String tableName)
- {
- return getBrokerForClass().serviceConnectionManager().
- getSupportedPlatform().getLastInsertIdentityQuery(tableName);
- }
-
- private void setFieldValue(Object obj, FieldDescriptor field, Long
identifier) throws SequenceManagerException
- {
- Object result = field.getJdbcType().sequenceKeyConversion(identifier);
- result = field.getFieldConversion().sqlToJava(result);
- PersistentField pf = field.getPersistentField();
- pf.set(obj, result);
- }
-
- /**
- * returns a negative value
- */
- protected long getUniqueLong(FieldDescriptor field) throws
SequenceManagerException
+ public SequenceManagerNativeImpl(PersistenceBroker broker,
SequenceDescriptor descriptor)
{
- /*
- arminw:
- workaround for locking problems of new objects
- We need unique 'dummy keys' for new objects before storing.
- Variable 'tempKey' is declared volatile, thus decrement should be
atomic
- */
- return --tempKey;
+ super(broker, descriptor);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]