Hi, any help with this one would be appreciated.

** Environment:
- Plain out-of-the-box jboss-3.0.4_tomcat-4.1.12
- Window NT, 4.0, patch-level 5

** Scenario:
- A stateless session bean method, i.e. updateShippedQuantities, loops on an entity bean method call, i.e. updateShippedQuantity, which updates one of the bean persistent attribute, i.e. OrderItem collection element.
- The session bean method needs to be run under a transaction.
- A Junit test case exercises the session method updateShippedQuantities, then verifies that the entity bean has been updated accordingly
- The unit test case fails if the session method is run under a transaction, but succeed otherwise (e.g. run with transaction type being Supports).

** Log4j data
- Two Junit test case runs, one with transaction (transaction=Required), one without (transaction=Supports).
- Log4j data were edited for readability, relevancy, comments



** Where I need help/understanding (please refer to inline the EJB method definitions, Junit test case, and log4j output)

- Why is there an SQL query at time 20:49:17,673 (the transaction based test case), and none was made at time 20:52:48,547 (test case with no transaction)? Both logs were generated following the orderCtrl.getOrderValue(order1.getId()); test case call. The only difference is the existence/non-existence of a transaction

- I'm assuming that even though the bean ejbStore method is being called (i.e. at time 20:49:04,224) this doesn't mean that the Transaction manager will actually write the bean to the DB. Right? From the Jboss documentation did I read that in an 'optimistic' transaction scenario, the transaction manager will established if the bean state has been modified between the transaction start/end, and write/don't-write the data. But then how is this 'bean-state-has-changed' being established? In my case, the bean persistent attribute being modified is a specific attribute (shippedQuantity) of OrderItem instances contained in a Collection that the bean manages. Is it possible that the transaction manager may not have detected that the bean state has changed, since the changes are 'buried' way down a collection element class attribute?

Thanks for any input/info you may have, I've been staring at this one for a couple days now, and I can only see 'stars' ;-)

Kris


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++
OrderController session method
++++++++++++++++++++++++++++++
/**
* Sets the collection order item shipped quantity. The method is 'wrapped'
* inside a transaction, so that all the items in the <code>items</code>
* collection are updated successfully, or none is if an error occurs.
*
* @param orderId The order id to set
* @param items A collection of OrderItem instances, with an updated
* shipped quantity field
*
* @ejb.interface-method
* view-type="both"
*
* @ejb.transaction
* type="Supports" <== This one was modified to Required
*/
public void updateShippedQuantities(String orderId, Collection items){
logger.enter();

try{
OrderLocal order = orderLocalHome.findByPrimaryKey(orderId);

logger.info(">>>>>>> Running with Transaction.type=Supports <<<<<<<<<");
Iterator iter = items.iterator();
while(iter != null && iter.hasNext()){
OrderItem item = (OrderItem)iter.next();
order.updateShippedQuantity(item);
}
} finally{
logger.exit();
}
}


++++++++++++++++++++++++++++++
Order Entity bean method
++++++++++++++++++++++++++++++

/**
* Sets an order item shipped quantity. The method is 'wrapped' inside
* a transaction, so that all the items in the <code>items</code> collection
* are updated successfully, or not is if an error occurs.
*
* @param item An OrderItem instances, with an updated
* shipped quantity field
*
* @ejb.interface-method
* view-type="both"
*
* @ejb.transaction
* type="Supports"
*/
public void updateShippedQuantity(OrderItem item){
logger.enter();
try{
ArrayList items = (ArrayList)getItems();
int index = items.indexOf(item);
if(index >= 0){
OrderItem currentItem = (OrderItem)items.get(index);
currentItem.setShippedQuantity(item.getShippedQuantity());
logger.info("Set shipped quantity " +
currentItem.getShippedQuantity() +
", on item " + currentItem.getProductId());
} else{
logger.error("Order item not found " + item.getProductId());
throw new InvalidParameterException(
"Order item not found " + item.getProductId());
}
} finally{
logger.exit();
}
}


++++++++++++++++++++++++++++++
Junit test case
++++++++++++++++++++++++++++++
/**
* Test of updateShippedQuantities method, of
* class com.newmancon.tos.ejb.order.interfaces.OrderCtrl
*
* Simple succes path
*/
public void testUpdateShippedQuantities1() {
//
// ... intitialize the test case
//

// Test the OrderController controller session method of interest
orderCtrl.updateShippedQuantities(order1.getId(), orderItems1);

// Get the order value, and verify that the shipped quantities have been
// modify
OrderValue orderValue = orderCtrl.getOrderValue(order1.getId());

//
// Verify the item shipped quantities using the above orderValue.
//
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ LOG4J output
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> START OF JUNIT TEST CASE, RUN #1 <<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>> TEST RUNNING WITH A TRANSACTION <<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Junit setup initialization
20:49:03,793 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:49:03,813 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8caad38242b7acda00ef1df6be3b8e59
20:49:03,813 INFO [OrderEJB:835] {Order ejbStore}Item id 8caac3d242b7acda01f2a9daf112c5b5, shipped: 0.0
20:49:03,853 INFO [OrderEJB:835] {Order ejbStore}Item id 8caac6cb42b7acda01ee69d33ad1fd70, shipped: 0.0
20:49:03,863 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:49:03,974 DEBUG [OrderControllerEJB:427] {OrderController setSessionContext}Enter
20:49:03,984 DEBUG [OrderControllerEJB:429] {OrderController setSessionContext}Exit

20:49:04,024 DEBUG [OrderControllerEJB:120] {OrderController ejbCreate}Enter
20:49:04,024 INFO [OrderControllerEJB:128] {OrderController ejbCreate}Created com.newmancon.tos.ejb.order.ejb.OrderControllerSession@b98a06
20:49:04,054 DEBUG [OrderControllerEJB:130] {OrderController ejbCreate}Exit

// Test case method call: updateShippedQuantities
20:49:04,084 DEBUG [OrderControllerEJB:228] {OrderController updateShippedQuantities}Enter
20:49:04,104 DEBUG [findByPrimaryKey:117] {OrderController updateShippedQuantities Order}Executing SQL: SELECT pk_key FROM ORDER_TABLE WHERE pk_key=?
20:49:04,114 INFO [OrderControllerEJB:238] {}>>>>>>> Running with Transaction.type=Required <<<<<<<<<

20:49:04,144 DEBUG [OrderEJB:651] {Order updateShippedQuantity}Enter
20:49:04,154 INFO [OrderEJB:671] {Order updateShippedQuantity}Set shipped quantity 1.0, on item 8caac3d242b7acda01f2a9daf112c5b5
20:49:04,164 DEBUG [OrderEJB:683] {Order updateShippedQuantity}Exit

20:49:04,174 DEBUG [OrderEJB:651] {Order updateShippedQuantity}Enter
20:49:04,184 INFO [OrderEJB:671] {Order updateShippedQuantity}Set shipped quantity 2.0, on item 8caac6cb42b7acda01ee69d33ad1fd70
20:49:04,194 DEBUG [OrderEJB:683] {Order updateShippedQuantity}Exit

20:49:04,204 DEBUG [OrderControllerEJB:248] {}Exit
// End of updateShippedQuantities method call

// End of transaction, save changes
20:49:04,224 DEBUG [OrderEJB:830] {ejbStore}Enter
20:49:04,234 INFO [OrderEJB:831] {ejbStore}Storing Order 8caad38242b7acda00ef1df6be3b8e59
//***************************************************************************************
// OK, even if this ejbStore method is called, does it really mean the Transaction will actually write
// the data to the DB???? See the next ejbStore comment block down
//
20:49:04,244 INFO [OrderEJB:835] {ejbStore}Item id 8caac3d242b7acda01f2a9daf112c5b5, shipped: 1.0
20:49:04,254 INFO [OrderEJB:835] {ejbStore}Item id 8caac6cb42b7acda01ee69d33ad1fd70, shipped: 2.0
//***************************************************************************************
20:49:04,264 DEBUG [OrderEJB:839] {ejbStore}Exit

// Test case orderCtrl.getOrderValue(order1.getId()); method call
20:49:17,673 DEBUG [Order:117] {Order}Executing SQL: SELECT account, accountId, customer, customerId, items, provincialTaxRate, federalTaxRate, shippingInfo, orderState, creationDate FROM ORDER_TABLE WHERE (pk_key=?)
20:49:17,994 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:49:18,004 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8caad38242b7acda00ef1df6be3b8e59
//***************************************************************************************
// Sure doesn't look like the last ejbStore did actually write the data to the DB (See: just last ejbStore log above).
// How come the shipped values are 0.0???
//
20:49:18,004 INFO [OrderEJB:835] {Order ejbStore}Item id 8caac3d242b7acda01f2a9daf112c5b5, shipped: 0.0
20:49:18,014 INFO [OrderEJB:835] {Order ejbStore}Item id 8caac6cb42b7acda01ee69d33ad1fd70, shipped: 0.0
//***************************************************************************************
20:49:18,024 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:49:18,064 DEBUG [OrderControllerEJB:385] {OrderController getOrderValue}Enter
20:49:18,074 DEBUG [findByPrimaryKey:117] {OrderController getOrderValue Order}Executing SQL: SELECT pk_key FROM ORDER_TABLE WHERE pk_key=?
20:49:18,094 DEBUG [Account:117] {Order Account}Executing SQL: SELECT type, description, creationDate FROM ACCOUNT WHERE (pk_key=?)
20:49:18,114 DEBUG [Customer:117] {Customer}Executing SQL: SELECT creationDate, contactinfo_id_fk FROM CUSTOMER WHERE (pk_key=?)
20:49:18,154 DEBUG [ContactInfo:117] {Customer ContactInfo}Executing SQL: SELECT familyName, givenName, telephone, email, creationDate, address_id_fk FROM CONTACTINFO WHERE (pk_key=?)
20:49:18,184 DEBUG [Customer:117] {}Executing SQL: SELECT account_id_fk FROM CUSTOMER_ACCOUNTS_ACCOUNT_CUSTOMERS WHERE (customer_id_fk=?)
20:49:18,224 DEBUG [ContactInfo:117] {ContactInfo}Executing SQL: SELECT familyName, givenName, telephone, email, creationDate, address_id_fk FROM CONTACTINFO WHERE (pk_key=?)
20:49:18,294 DEBUG [Address:117] {ContactInfo Address}Executing SQL: SELECT streetName, city, state, zip, country, creationDate FROM ADDRESS WHERE (pk_key=?)
20:49:18,314 DEBUG [OrderEJB:830] {ejbStore}Enter
20:49:18,324 INFO [OrderEJB:831] {ejbStore}Storing Order 8caad38242b7acda00ef1df6be3b8e59
20:49:18,334 INFO [OrderEJB:835] {ejbStore}Item id 8caac3d242b7acda01f2a9daf112c5b5, shipped: 0.0
20:49:18,344 INFO [OrderEJB:835] {ejbStore}Item id 8caac6cb42b7acda01ee69d33ad1fd70, shipped: 0.0
20:49:18,364 DEBUG [OrderEJB:839] {ejbStore}Exit
20:49:18,384 DEBUG [OrderControllerEJB:400] {}Exit








>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> START OF JUNIT TEST CASE RUN #2 <<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>> TEST RUNNING WITHOUT TRANSACTION <<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Junit setup initialization
20:52:03,812 INFO [OrderEJB:831] {ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:03,822 INFO [OrderEJB:835] {ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 0.0
20:52:03,832 INFO [OrderEJB:835] {ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 0.0
20:52:03,842 DEBUG [OrderEJB:839] {ejbStore}Exit

20:52:27,276 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:52:27,286 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:27,316 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 0.0
20:52:27,326 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 0.0
20:52:27,336 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:52:27,396 DEBUG [OrderControllerEJB:427] {OrderController setSessionContext}Enter
20:52:27,406 DEBUG [OrderControllerEJB:429] {OrderController setSessionContext}Exit

20:52:27,426 DEBUG [OrderControllerEJB:120] {OrderController ejbCreate}Enter
20:52:27,436 INFO [OrderControllerEJB:128] {OrderController ejbCreate}Created com.newmancon.tos.ejb.order.ejb.OrderControllerSession@1756db3
20:52:27,446 DEBUG [OrderControllerEJB:130] {OrderController ejbCreate}Exit

// Test case updateShippedQuantities method call
// Begin of Transaction
20:52:27,466 DEBUG [OrderControllerEJB:228] {OrderController updateShippedQuantities}Enter
20:52:27,476 DEBUG [findByPrimaryKey:117] {OrderController updateShippedQuantities Order}Executing SQL: SELECT pk_key FROM ORDER_TABLE WHERE pk_key=?
20:52:27,496 INFO [OrderControllerEJB:238] {}>>>>>>> Running with Transaction.type=Supports <<<<<<<<<

20:52:27,526 DEBUG [OrderEJB:651] {Order updateShippedQuantity}Enter
20:52:27,536 INFO [OrderEJB:671] {Order updateShippedQuantity}Set shipped quantity 1.0, on item 8cae4e1542b7acda006d06b09ded6477
20:52:27,546 DEBUG [OrderEJB:683] {Order updateShippedQuantity}Exit

20:52:27,566 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:52:27,576 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:27,596 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 1.0
20:52:27,606 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 0.0
20:52:27,636 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:52:27,646 DEBUG [OrderEJB:651] {Order updateShippedQuantity}Enter
20:52:27,656 INFO [OrderEJB:671] {Order updateShippedQuantity}Set shipped quantity 2.0, on item 8cae50b442b7acda01346812e0b9cb88
20:52:27,666 DEBUG [OrderEJB:683] {Order updateShippedQuantity}Exit

20:52:27,687 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:52:27,687 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:27,717 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 1.0
20:52:27,727 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 2.0
20:52:27,737 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:52:27,747 DEBUG [OrderControllerEJB:248] {}Exit
// End of updateShippedQuantities method call


// Get orderCtrl.getOrderValue(order1.getId()); method call
//***************************************************************************************
// Why is it that there's not SQL select call here. See previous test case run log output at time 20:49:17,673.
// The only difference in code here, is that the former/previous was run under a transaction, and here the test case
// is run without a transaction.
//
//***************************************************************************************

20:52:48,547 DEBUG [OrderEJB:830] {Order ejbStore}Enter
20:52:48,547 INFO [OrderEJB:831] {Order ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:48,557 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 1.0
20:52:48,577 INFO [OrderEJB:835] {Order ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 2.0
20:52:48,587 DEBUG [OrderEJB:839] {Order ejbStore}Exit

20:52:48,627 DEBUG [OrderControllerEJB:385] {OrderController getOrderValue}Enter
20:52:48,647 DEBUG [findByPrimaryKey:117] {OrderController getOrderValue Order}Executing SQL: SELECT pk_key FROM ORDER_TABLE WHERE pk_key=?
20:52:48,677 DEBUG [Account:117] {Order Account}Executing SQL: SELECT type, description, creationDate FROM ACCOUNT WHERE (pk_key=?)
20:52:48,717 DEBUG [Customer:117] {Customer}Executing SQL: SELECT creationDate, contactinfo_id_fk FROM CUSTOMER WHERE (pk_key=?)
20:52:48,747 DEBUG [ContactInfo:117] {Customer ContactInfo}Executing SQL: SELECT familyName, givenName, telephone, email, creationDate, address_id_fk FROM CONTACTINFO WHERE (pk_key=?)
20:52:48,787 DEBUG [Customer:117] {}Executing SQL: SELECT account_id_fk FROM CUSTOMER_ACCOUNTS_ACCOUNT_CUSTOMERS WHERE (customer_id_fk=?)
20:52:48,827 DEBUG [ContactInfo:117] {ContactInfo}Executing SQL: SELECT familyName, givenName, telephone, email, creationDate, address_id_fk FROM CONTACTINFO WHERE (pk_key=?)
20:52:48,847 DEBUG [Address:117] {ContactInfo Address}Executing SQL: SELECT streetName, city, state, zip, country, creationDate FROM ADDRESS WHERE (pk_key=?)
20:52:48,877 DEBUG [OrderEJB:830] {ejbStore}Enter
20:52:48,887 INFO [OrderEJB:831] {ejbStore}Storing Order 8cae5da742b7acda01341183c7a62ea6
20:52:48,897 INFO [OrderEJB:835] {ejbStore}Item id 8cae4e1542b7acda006d06b09ded6477, shipped: 1.0
20:52:48,917 INFO [OrderEJB:835] {ejbStore}Item id 8cae50b442b7acda01346812e0b9cb88, shipped: 2.0
20:52:48,927 DEBUG [OrderEJB:839] {ejbStore}Exit

20:52:48,967 DEBUG [OrderControllerEJB:400] {}Exit

Reply via email to