Hi, I have 2 tables CUSTOMER and DEPENDENT.
In CUSTOMER table the primary key is cust_id which is foreign key to DEPENDENT table. I would like to make insert to both tables together as a batch and also if one fails than other must roll back. If I remove the constraints of having cust_id as a foreign key to DEPENDENT table than both insert works fine as required, it gets committed together and if any of it fails than none of the transaction will commit. But as soon as I have two tables related, it works fine for first insert to CUSTOMER table, when I make a call to insert() statement, it does not commit yet, but when it reaches second insert() stmt to DEPENDENT table it throws below exception: -- The error occurred in org/nexweb/qol/gcc/ibatis/dao/xml/Customer.xml. --- The error occurred while applying a parameter map. --- Check the insertCustomerDependent-InlineParameterMap. --- Check the statement (update failed). --- Cause: java.sql.SQLException: ORA-02291: integrity constraint (DEPENDENT_CUST_ID_FK) violated - parent key not found Can you check what am I missing ? I have also tried using SqlMapSession explicitly opening session and do all transaction but did not work. I have been trying since last 2 days, please help me out. Here is my code: I am using JDeveloper 10.1.3 as my IDE which has embedded OC4J application server. SqlMapConfig.xml <properties resource="jdbc.properties"/> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${jdbc.driverClassName}"/> <property name="JDBC.ConnectionURL" value="${jdbc.url}"/> <property name="JDBC.Username" value="${jdbc.username}"/> <property name="JDBC.Password" value="${jdbc.password}"/> <property name="JDBC.Class" value="oracle.jdbc.pool.OracleDataSource"/> <property name="JDBC.DefaultAutoCommit" value="false" /> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="120000"/> <property name="Pool.TimeToWait" value="500"/> </dataSource> </transactionManager> <sqlMap resource="org/nexweb/qol/gcc/ibatis/dao/xml/Customer.xml"/> spring.xml <beans> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"> <value>classpath:org/nexweb/qol/gcc/ibatis/config/SqlMapConfig.xml</value> </property> </bean> <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> <property name="sqlMapClient"> <ref bean="sqlMapClient"/> </property> </bean> <bean id="customerDao" class="org.nexweb.qol.gcc.ibatis.dao.sqlmaps.CustomerSqlMapDAO"> <property name="sqlMapClient"> <ref bean="sqlMapClient"/> </property> </bean> <bean id="customerService" class="org.nexweb.qol.gcc.ibatis.services.CustomerService"> <constructor-arg index="0" ref="customerDao"/> </bean> CustomerSqlMapDAO public class CustomerSqlMapDAO extends SqlMapClientTemplate implements CustomerDAO { public Integer insertCustomer(CustomerVO customerVo) throws DataAccessException { return (Integer)insert("insertCustomer", customerVo); } public Integer insertCustomerDependent(CustomerDependentVO customerDependentVo) throws DataAccessException { return (Integer)insert("insertCustomerDependent", customerDependentVo); } CustomerService public class CustomerService extends CommonService { private CustomerDAO customerDAO; public CustomerService(CustomerDAO customerDAO) { super(customerDAO); this.customerDAO = customerDAO; } public Integer insertCustomer(CustomerVO customerVo) throws DataAccessException { return customerDAO.insertCustomer(customerVo); } public Integer insertCustomerDependent(CustomerDependentVO customerDependentVo) throws DataAccessException { return customerDAO.insertCustomerDependent(customerDependentVo); } CustomerAction.java CustomerService customerService = SpringBeans.getCustomerService(); try { // retrieve cust_id from QOL_CUSTOMER using qol_customer_seq.NEXTVAL custId = customerService.getCustomerId(); customerService.startTransaction(); // start batch process customerService.startBatch(); // insert record into QOL_CUSTOMER table (add to batch process) customerService.insertCustomer(customerVo); // retrive dependent first/last name for insertion check to QOL_DEPENDENT tabel String custDepFirstName = customerPersonalForm.getDepFirstName(); String custDepLastName = customerPersonalForm.getDepLastName(); // insert into DEPENDENT table only if dependent first/last name enterd on the form if (StringUtils.isNotBlank(custDepFirstName) || StringUtils.isNotBlank(custDepLastName)) { customerDependentVo.setCustId(custId); // set CustomerDependentVO to CustomerVO only if dependent first/last name exist and // record to DEPENDENT is going to be inserted in for this customer id customerVo.setCustomerDependentVo(customerDependentVo); // insert record into DEPENDENT table (add to batch process) customerService.insertCustomerDependent(customerDependentVo); } // insert record into VEHICLE table (add to batch process) customerVehicleService.insertCustomerVehicle(customerVehicleVo); --> same issue with this insert, if i remove constraint from DEPENDENT // execute batch customerService.executeBatch(); // end batch process customerService.commitTransaction(); } catch(SQLException sqlEx) { ........... } finally { try { customerService.endTransaction(); } catch(SQLException sqlEx) { errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("gcc.error.db.exception")); logger.error(ExceptionUtils.getStackTrace(sqlEx)); } } } ****************************************************************************** This email and any files transmitted with it are intended solely for the use of the individual or agency to whom they are addressed. If you have received this email in error please notify the Navy Exchange Service Command e-mail administrator. This footnote also confirms that this email message has been scanned for the presence of computer viruses. Thank You! ******************************************************************************