protected void insertEntity(EntityEnterpriseContext ctx) throws CreateException {
Connection con = null;
PreparedStatement ps = null;
int rowsAffected = 0;
try
{
// get the connection
DataSource dataSource = entity.getDataSource();
con = dataSource.getConnection();
// create the statement
log.debug("Executing SQL: " + insertEntitySQL);
ps = con.prepareStatement(insertEntitySQL,
PreparedStatement.RETURN_GENERATED_KEYS);
// set the parameters
int index = 1;
for( Iterator iter = insertFields.iterator(); iter.hasNext(); )
{
JDBCFieldBridge field = (JDBCFieldBridge)iter.next();
index = field.setInstanceParameters(ps, index, ctx);
}
// execute statement
rowsAffected = ps.executeUpdate();
// check results
if(rowsAffected != 1)
{
throw new CreateException("Insertion failed. Expected one " +
"affected row: rowsAffected=" + rowsAffected +
"id=" + ctx.getId());
}
log.debug("Rows affected = " + rowsAffected);
// fetch generated keys
ResultSet rs = ps.getGeneratedKeys();
Object pk = null;
if( rs.next() ) pk = rs.getObject( 1 );
if( pk == null )
{
throw new Exception( "Primary key isn't generated." );
}
// write pk fields to the context
for( Iterator iter = entity.getPrimaryKeyFields().iterator();
iter.hasNext(); )
{
JDBCCMPFieldBridge cmpField = (JDBCCMPFieldBridge) iter.next();
cmpField.setInstanceValue( ctx, pk );
break;
}
}
catch( CreateException ce )
{
throw ce;
}
catch(Exception e)
{
log.error("Could not create entity", e);
throw new CreateException("Could not create entity:" + e);
} finally {
JDBCUtil.safeClose(ps);
JDBCUtil.safeClose(con);
}
// Mark the inserted fields as clean.
for( Iterator iter = insertFields.iterator(); iter.hasNext(); )
{
JDBCFieldBridge field = (JDBCFieldBridge)iter.next();
field.setClean(ctx);
}
}
|