Hi, I tried to create a application managed entity manager as follows.
persistence.xml ----------------------- <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="AccountUnit" transaction-type="RESOURCE_LOCAL"> <description>BeanManagedJPA</description> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <jta-data-source>AccountDS</jta-data-source> <class>sample.jpa.Account</class> <class>sample.jpa.Person</class> </persistence-unit> </persistence> Here the 'AccountDS' is the datasource deployed over 'AccountDB' in embedded derby database. --------------- I have the stateful 'AccountBean' that has the following code --------------- @Stateful @Local(AccountInterface.class) @TransactionManagement(TransactionManagementType.BEAN) public class AccountBean implements AccountInterface{ @PersistenceUnit(unitName="AccountUnit") private EntityManagerFactory emf; private EntityManager em; Account account; Person person; @PostConstruct public void init(){ em = emf.createEntityManager(); } public void initialize(int accountNumber){ account = em.find(Account.class, accountNumber); if(account == null)throw new IllegalStateException("Account number ("+accountNumber+") not found"); person = em.find(Person.class, account.getPersonId()); if(person == null)throw new IllegalStateException ("Person Id("+account.getPersonId()+ ") not found. There is a descripancy in the database for account number ("+accountNumber+")"); } [...] public void updateAllValues(String address, String personName, double balance){ em.getTransaction().begin(); System.out.println("Local Transaction Begin-->"); setAddress(address); setPersonName(personName); setBalance(balance); em.getTransaction().commit(); System.out.println("Local Transaction Commit-->"); } [...] public void withdraw(double amount){ if(amount > getBalance()) throw new IllegalStateException("The amount("+amount+ ") to be withdrawn is more than the available balance("+getBalance()+")"); try{ System.out.println("Method withdraw : message ---> 1"); em.joinTransaction(); System.out.println("Method withdraw : message ---> 2"); setBalance(getBalance() - amount); System.out.println("Method withdraw : message ---> 3"); }catch(Exception e){ throw new IllegalStateException(e); } } public void deposit(double amount){ try{ em.joinTransaction(); setBalance(getBalance() + amount); }catch(Exception e){ throw new IllegalStateException(e); } } The setAddress(address), setPersonName(personName), setBalance(balance) methods simply set the values to 'Account' and 'Person' entities declared at the class level. I also call 'initialize()' method to initialize 'person' and 'account' fields in the stateful session bean. Please also note that @TransactionManagement(TransactionManagementType.BEAN) is declared. --------------- The 'updateAllValues()' method uses local transaction to update name, address, balance fields in 'account' and 'person' entities. It is expected that the method is called with no active transaction. However, 'withdraw(amount)' and 'deposit(amount)' methods are called in a transaction. Hence, the entity managers are joined to the active transaction. The typical web client for the bean is as follows. --------------- [...] int debitAccount = Integer.parseInt(request.getParameter("accountNumber1")); int creditAccount = Integer.parseInt(request.getParameter("accountNumber2")); double amount = Double.parseDouble(request.getParameter("amount")); Context ctx = new InitialContext(); AccountInterface debitAccountBean = (AccountInterface)ctx.lookup("java:comp/env/ejb/AccountInterface"); debitAccountBean.initialize(debitAccount); AccountInterface creditAccountBean = (AccountInterface)ctx.lookup("java:comp/env/ejb/AccountInterface"); creditAccountBean.initialize(creditAccount); UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); ut.begin(); debitAccountBean.withdraw(amount); creditAccountBean.deposit(amount); ut.commit(); [...] --------------- When I exceute this part of code, I am getting the following exception at the point where 'em.joinTransaction()' is performed in the 'withdraw(amount)' method above. ********************* Method withdraw : message ---> 1 14:47:38,828 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception java.rmi.NoSuchObjectException: Not Found at org.apache.openejb.core.stateful.StatefulInstanceManager.activateInst ance(StatefulInstanceManager.java:317) at org.apache.openejb.core.stateful.StatefulInstanceManager.obtainInstan ce(StatefulInstanceManager.java:282) at org.apache.openejb.core.stateful.StatefulInstanceManager.getBeanEntry (StatefulInstanceManager.java:560) at org.apache.openejb.core.stateful.StatefulInstanceManager.setBeanTrans action(StatefulInstanceManager.java:126) at org.apache.openejb.core.stateful.StatefulBeanManagedTxPolicy.afterInv oke(StatefulBeanManagedTxPolicy.java:77) at org.apache.openejb.core.stateful.StatefulContainer._invoke(StatefulCo ntainer.java:467) at org.apache.openejb.core.stateful.StatefulContainer.businessMethod(Sta tefulContainer.java:413) at org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulCon tainer.java:271) at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbO bjectProxyHandler.java:217) at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectPr oxyHandler.java:77) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHa ndler.java:321) at org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke(Jdk13Invo cationHandler.java:49) at $Proxy152.withdraw(Unknown Source) at org.apache.jsp.TransferAmount_jsp._jspService(TransferAmount_jsp.java :85) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper .java:388) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:3 20) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:175) at org.apache.geronimo.tomcat.valve.DefaultSubjectValve.invoke(DefaultSu bjectValve.java:56) at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve. invoke(GeronimoStandardContext.java:406) at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(Gero nimoBeforeAfterValve.java:47) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:109) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 563) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav a:263) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce ss(Http11Protocol.java:584) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44 7) at java.lang.Thread.run(Thread.java:803) ****************** I verified with both AG2.1 and AG2.1.1. Can somebody throw some light on this issue?? Thanks Phani
