org.sormula.operation
Class SaveOperation<R>

java.lang.Object
  extended by org.sormula.operation.SqlOperation<R>
      extended by org.sormula.operation.ModifyOperation<R>
          extended by org.sormula.operation.SaveOperation<R>
Type Parameters:
R - class type which contains members for columns of a row in a table

public class SaveOperation<R>
extends ModifyOperation<R>

SQL update or insert operation for row of type R. Rows are updated if they exist in the database or inserted if they are new rows. Cascades are performed based upon Cascade.saves(), OneToManyCascade.saves(), or OneToOneCascade.saves().

Inserts and updates are performed by class members of type InsertOperation and UpdateOperation. Since most of the work is delegated to InsertOperation and UpdateOperation, not all methods of base class ModifyOperation are used. All of the methods in SaveOperation may be safely overridden but some subclass methods may not be used.

Since:
1.1
Author:
Jeff Miller

Constructor Summary
SaveOperation(Table<R> table)
          Constructs to update by primary key or insert if update fails.
SaveOperation(Table<R> table, java.lang.String whereConditionName)
          Constructs to update by where condition or insert if update fails.
 
Method Summary
 void close()
          Cleans up after operation is no longer needed.
 void execute()
          Executes operation for all row parameters using current prepared statement.
protected  void postExecute(R row)
          Invoked after JDBC execute.
protected  void postExecuteCascade(R row)
          Invoked after JDBC execute.
protected  void preExecute(R row)
          Invoked prior to JDBC execute.
protected  void preExecuteCascade(R row)
          Invoked prior to JDBC execute.
protected  java.util.List<CascadeOperation<R,?>> prepareCascades(java.lang.reflect.Field field)
          Creates save cascade operations based upon the save annotations for field.
 int save(java.lang.Object... parameters)
          Saves rows based upon parameters.
 int save(R row)
          Saves a row.
 int saveAll(java.util.Collection<R> rows)
          Saves all rows in collection.
 
Methods inherited from class org.sormula.operation.ModifyOperation
getRowsAffected, isBatch, modify, modify, modifyAll, setBatch, setParameters, setRow, setRows, setRows, setRows, setRowsAffected
 
Methods inherited from class org.sormula.operation.SqlOperation
cancel, cascade, closeCascades, closeStatement, createTargetField, getBaseSql, getConnection, getCustomSql, getNextParameter, getOperationTime, getParameters, getPreparedSql, getPreparedStatement, getQueryTimeout, getSql, getTable, getTargetTable, getTimingId, getWhereConditionName, getWhereTranslator, initOperationTime, isAutoGeneratedKeys, isIncludeIdentityColumns, isReadOnly, isTimings, logTimings, prepare, prepareCascades, prepareCheck, prepareColumns, prepareParameters, prepareWhere, setAutoGeneratedKeys, setBaseSql, setCustomSql, setIncludeIdentityColumns, setNextParameter, setQueryTimeout, setReadOnly, setTimingId, setTimings, setWhere, setWhereTranslator, writeColumns, writeParameter, writeParameters, writeWhere
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SaveOperation

public SaveOperation(Table<R> table)
              throws OperationException
Constructs to update by primary key or insert if update fails.

Parameters:
table - update/insert to this table
Throws:
OperationException - if error

SaveOperation

public SaveOperation(Table<R> table,
                     java.lang.String whereConditionName)
              throws OperationException
Constructs to update by where condition or insert if update fails.

Parameters:
table - update/insert to this table
whereConditionName - name of where condition to use for update ("primaryKey" to update by primary key; empty string to update all rows in table)
Throws:
OperationException - if error
Method Detail

close

public void close()
           throws OperationException
Description copied from class: ModifyOperation
Cleans up after operation is no longer needed. The connection is not closed but all other objects created by this operations are closed. Prepared statement is closed and close method is invoked on all CascadeOperation objects. This method should be invoked when operation is no longer needed for proper JDBC clean up.

Overrides:
close in class ModifyOperation<R>
Throws:
OperationException - if error

save

public int save(R row)
         throws OperationException
Saves a row. Set parameters, executes, closes. Alias for ModifyOperation.modify(Object).

Parameters:
row - row to use for parameters
Returns:
ModifyOperation.getRowsAffected()
Throws:
OperationException - if error
Since:
1.4

saveAll

public int saveAll(java.util.Collection<R> rows)
            throws OperationException
Saves all rows in collection. Set parameters, executes, closes. Alias for ModifyOperation.modifyAll(Collection).

Parameters:
rows - collection of rows to use as parameters
Returns:
ModifyOperation.getRowsAffected()
Throws:
OperationException - if error
Since:
1.4

save

public int save(java.lang.Object... parameters)
         throws OperationException
Saves rows based upon parameters. Set parameters, executes, closes. Alias for ModifyOperation.modify(Object...).

Parameters:
parameters - operation parameters as objects (see ModifyOperation.setParameters(Object...))
Returns:
count of rows affected
Throws:
OperationException - if error
Since:
1.4

execute

public void execute()
             throws OperationException
Description copied from class: ModifyOperation
Executes operation for all row parameters using current prepared statement. ModifyOperation.getRowsAffected() will return the sum of all rows affected.

Overrides:
execute in class ModifyOperation<R>
Throws:
OperationException - if error

prepareCascades

protected java.util.List<CascadeOperation<R,?>> prepareCascades(java.lang.reflect.Field field)
                                                         throws OperationException
Creates save cascade operations based upon the save annotations for field.

Specified by:
prepareCascades in class SqlOperation<R>
Parameters:
field - annotation is for this field of row class R
Returns:
list of save cascade operations; empty list for none
Throws:
OperationException - if error
Since:
1.9.3 and 2.3.3

preExecute

protected void preExecute(R row)
                   throws OperationException
Invoked prior to JDBC execute. Override to modify the row prior to JDBC execute. Default implementaion does nothing. This method is not invoked when ModifyOperation.setParameters(Object...) is used since no row is available.

Overrides:
preExecute in class ModifyOperation<R>
Parameters:
row - row for JDBC execute
Throws:
OperationException - if error

postExecute

protected void postExecute(R row)
                    throws OperationException
Invoked after JDBC execute. Override to modify the row after JDBC execute has occured. Default implementaion does nothing. This method is not invoked when ModifyOperation.setParameters(Object...) is used since no row is available.

Overrides:
postExecute in class ModifyOperation<R>
Parameters:
row - row for JDBC execute
Throws:
OperationException - if error

preExecuteCascade

protected void preExecuteCascade(R row)
                          throws OperationException
Invoked prior to JDBC execute. Performs all modify cascade operations where post flag is false.

Overrides:
preExecuteCascade in class ModifyOperation<R>
Parameters:
row - row for JDBC execute
Throws:
OperationException
See Also:
InsertCascade.post(), UpdateCascade.post(), SaveCascade.post(), DeleteCascade.post()

postExecuteCascade

protected void postExecuteCascade(R row)
                           throws OperationException
Invoked after JDBC execute. Performs all modify cascade operations where post flag is true.

Overrides:
postExecuteCascade in class ModifyOperation<R>
Parameters:
row - row for JDBC execute
Throws:
OperationException
See Also:
InsertCascade.post(), UpdateCascade.post(), SaveCascade.post(), DeleteCascade.post()