BMT in Seam
asookazian Aug 12, 2009 8:38 PMThe following SFSB is a refactoring of a Servlet example from the Java Transaction Processing book by Mark Little, et al.
The CRUD is not happening (no changes to database). If I remove the following annotation:
@TransactionManagement(TransactionManagementType.BEAN)
which defaults to CMT, the tx commits both CRUD operations to db.
Why is this not working with BMT and does Seam even support BMT with session beans? I don't see it in the list in Table 9.3 in SiA book.
The following line is not throwing any exception:
tx.commit ();
???
/** * This SFSB demonstrates the creation of a distributed transaction that scopes work performed against * two different databases. */ @Name("testJTPBean") @AutoCreate @Install(true) @Stateful @TransactionManagement(TransactionManagementType.BEAN) public class TestJTPBean implements TestJTPLocal { @Logger Log log; @In EntityManager em; //Seam tx injection //@In(create=true) //UTTransaction tx; private static final String USER_TX_LOOKUP_STR = "java:comp/UserTransaction"; @Begin(join=true) public void doTransfer() { // get empNo to transfer boolean success = false; UserTransaction tx = null; int empNo = 0; try { empNo = 1; InitialContext ic = new InitialContext(); tx = (UserTransaction) ic.lookup ( USER_TX_LOOKUP_STR ); tx.begin (); removeHotel ( empNo ); addHotel (); success = true; } catch ( Exception e ) { log.error("exception: ", e); } finally { if (!success) { rollback ( tx ); } else { commit ( tx ); } log.info("success = "+success); } } protected void addHotel() { Hotel hotel = new Hotel(); hotel.setAddress("1234 test"); hotel.setName("myName"); hotel.setCity("myCity"); hotel.setZip("90000"); hotel.setState("CA"); hotel.setCountry("USA"); em.persist(hotel); } private void removeHotel(int empNo) { Hotel hotel = em.find(Hotel.class, new Long(1)); em.remove(hotel); } private void commit ( UserTransaction tx ) { try { tx.commit (); } catch ( Exception e ) { log.error("error: ", e); } } private void rollback ( UserTransaction tx ) { try { tx.rollback (); } catch ( Exception e ) { log.error("error: ", e); } } @Remove @Destroy public void destroy(){} }
output:
11:32:17,370 INFO [STDOUT] Hibernate: select hotel0_.id as id121_0_, hotel0_.address as address121_0_, hotel0_.name as name121_0_, hotel0_.state as state121_0_, hotel0_.country as country121_0_, hotel0_.price as price121_0_, hotel0_.city as city121_0_, hotel0_.zip as zip121_0_ from Hotel hotel0_ where hotel0_.id=? 11:32:17,385 WARN [PermissionManager] no permission store available - please install a PermissionStore with the name 'org.jboss.seam.security.jpaPermissionStore' if permission management is required. 11:32:17,385 INFO [TestJTPBean] success = true
components.xml:
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:persistence="http://jboss.com/products/seam/persistence" xmlns:security="http://jboss.com/products/seam/security" xmlns:transaction="http://jboss.com/products/seam/transaction" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.1.xsd http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd"> <core:init jndi-pattern="@jndiPattern@" debug="true" distributable="@distributable@" transaction-management-enabled="false"/> <core:manager conversation-timeout="120000" concurrent-request-timeout="500" conversation-id-parameter="cid"/> <!-- <transaction:ejb-transaction/> --> <security:identity authenticate-method="#{authenticator.authenticate}"/> <persistence:managed-persistence-context name="em" auto-create="true" persistence-unit-jndi-name="java:/jbossEntityManagerFactory"/> <persistence:managed-persistence-context name="em2" auto-create="true" persistence-unit-jndi-name="java:/jboss2EntityManagerFactory"/> <!-- JMS setup --> <component name="topicPublisher" class="org.jboss.seam.jms.ManagedTopicPublisher"> <property name="topicJndiName">topic/chatroomTopic</property> </component> <component name="queueSender" class="org.jboss.seam.jms.ManagedQueueSender"> <property name="queueJndiName">queue/chatroomQueue</property> </component> </components>