You are not using pure SQL somewhere in this part? Cause if you do, this code run in
another transaction than the CMP-code and thus don't see the changes of the CMP before
that transaction is commited.
For me this resulted in the junit test failing, and I had to commit the
usertransaction inside the junit test method for the SQL to see the changes.
BTW: Is it possible to let CMP-code and SQL-code these run in the same transaction
(connection)?
--
MVH
Marius Kotsbak
Boost communications AS
On Sat, Jan 04, 2003 at 11:09:17PM -0800, Kris wrote:
> 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
>
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user