I use Spring tx mgt with the Spring JtaTransactionManager. Under the covers it obtains and uses the JTA UserTransaction. This means that I get a consistent programming model--I can test with local transactions, such as JDBC, Hibernate or JDO transactions. Also, I get the value-added features of Spring's declarative transaction mgt that EJB CMT doesn't offer, such as rollback rules. And I can test my declarative tx mgt in integration tests outside the container, which is a real productivity gain in my experience.