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);
// 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();
// cast to the wrapped statement
org.jboss.ejb.plugins.cmp.jdbc.WrappedStatement ws =
(org.jboss.ejb.plugins.cmp.jdbc.WrappedStatement) ps;
// fetch underlying statement and cast it to MySQL native
com.mysql.jdbc.PreparedStatement mySqlStmt =
(com.mysql.jdbc.PreparedStatement) ws.getUnderlyingStatement();
ResultSet rs = mySqlStmt.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(Exception e) {
log.error("Could not create entity", e);
throw new CreateException("Could not create entity:" + e);
} finally {
JDBCUtil.safeClose(ps);
JDBCUtil.safeClose(con);
}
// check results
if(rowsAffected != 1) {
throw new CreateException("Insertion failed. Expected one " +
"affected row: rowsAffected=" + rowsAffected +
"id=" + ctx.getId());
}
log.debug("Rows affected = " + rowsAffected);
// Mark the inserted fields as clean.
for(Iterator iter = insertFields.iterator(); iter.hasNext(); ) {
JDBCFieldBridge field = (JDBCFieldBridge)iter.next();
field.setClean(ctx);
}
}
This method executes MySQL specific code |