ejb@glassfish.java.net

Re: Strange issue

From: Chase <chase_at_osdev.org>
Date: Sun, 10 Apr 2011 13:51:11 -0500

Your bean is configured to use CMT (container managed transactions)
but you are trying to treat it like BMT (bean managed transactions).

Read the rules at http://download.oracle.com/javaee/6/tutorial/doc/bncij.html

-Chase

On Sun, Apr 10, 2011 at 10:14 AM, Jose Alvarez de Lara
<dakhla.0563_at_hotmail.com> wrote:
> Hi Cheng,
>
> I am trying container-managed persistence using injection.
> But now I am getting an IllegalStateException:
> Exception Description: Cannot use an EntityTransaction while using JTA.
> Here is the code of one EJB,
>
> public class RegionsFacade implements java.io.Serializable {
>
> private static final long serialVersionUID = 1L;
>
> @PersistenceContext(unitName="JPACallingOracleStoredProcedure-jpa")
> EntityManager em;
>
> /**
> * Default constructor.
> */
>
> public RegionsFacade() {
> // TODO Auto-generated constructor stub
> }
>
> public HashMap<String, List<String>> findAll()
> throws Exception {
> //EntityManagerFactory emf =
> Persistence.createEntityManagerFactory("JPACallingOracleStoredProcedure-jpa");
> //EntityManager em = emf.createEntityManager();
>
> HashMap<String, List<String>> hashMap = new HashMap<String, List<String>>();
> EntityTransaction et = em.getTransaction();
>
> try {
>
> et.begin();
>
> javax.persistence.criteria.CriteriaQuery<Country> cq1 =
> em.getCriteriaBuilder().createQuery(Country.class);
> cq1.select(cq1.from(Country.class));
> List<Country> listCountries = (List<Country>)
> em.createQuery(cq1).getResultList();
>
> et.commit();
>
> et.begin();
>
> javax.persistence.criteria.CriteriaQuery<Region> cq2 =
> em.getCriteriaBuilder().createQuery(Region.class);
> cq2.select(cq2.from(Region.class));
> List<Region> allRegions = (List<Region>)
> em.createQuery(cq2).getResultList();
>
> et.commit();
>
> for(Region r: allRegions){
> List<String> myList = new ArrayList<String>();
> BigDecimal myRegionId = new BigDecimal(r.getRegionId());
> for(Country c: listCountries){
> if((c.getRegionId()).equals(myRegionId)){
> myList.add(c.getCountryName());
> }
> }
>
> hashMap.put(r.getRegionName(), myList);
> }
> } catch(EJBException ex) {
> et.rollback();
> throw ex;
> }
>
> return hashMap;
> }
>
> public HashMap<BigDecimal, String> findAllRegions()
> throws Exception {
> //EntityManagerFactory emf =
> Persistence.createEntityManagerFactory("JPACallingOracleStoredProcedure-jpa");
> //EntityManager em = emf.createEntityManager();
>
> HashMap<BigDecimal, String> hashMap = new HashMap<BigDecimal, String>();
>
> EntityTransaction et = em.getTransaction();
> try {
>
> et.begin();
>
> javax.persistence.criteria.CriteriaQuery<Region> cq =
> em.getCriteriaBuilder().createQuery(Region.class);
> cq.select(cq.from(Region.class));
> List<Region> list = (List<Region>) em.createQuery(cq).getResultList();
>
> et.commit();
>
> for(Region r: list){
> hashMap.put(new BigDecimal(r.getRegionId()), r.getRegionName());
> }
> } catch (EJBException ex){
> et.rollback();
> throw ex;
> }
>
> return hashMap;
> }
> }
>
> I have been googling but it is not eassy to find out a solution for this
> issue.
>
> If you kindly can suggest me anything I should thank you.
>
> Regards,
> Jose
>
> From: Cheng Fang
> Sent: Friday, April 08, 2011 9:37 PM
> To: ejb_at_glassfish.java.net
> Subject: Re: Strange issue
> One thing standing out is, you are not using container-managed persistence
> context.  It could've caused interference between different contexts.  I
> suggest change to use a consistent, container-managed persistence context by
> using injection or lookup.
> -cheng
>
> On 4/8/11 3:17 PM, Jose Alvarez de Lara wrote:
>
> Hi,
>
> I am trying a web app that implements some EJB 3.1 calling showing the
> results in JSP files.
>
> And I am finding a strange issue that is some times the EJBs return a result
> set and other times
> return an EJBException. To call the EJBs I use a controller Servlet that
> dispatches to the JSP files.
>
> Here is the code of the EJBs,
>
> @Stateless
> @LocalBean
> public class CallStoredProcedure implements java.io.Serializable {
>
>  private static final long serialVersionUID = 1L;
>
>  /**
>      * Default constructor.
>      */
>     public CallStoredProcedure() {
>         // TODO Auto-generated constructor stub
>     }
>
>     @SuppressWarnings("unchecked")
>  public List<Country> getCountriesSP(BigDecimal region)
>      throws Exception {
>
>      final Logger logger = Logger.getLogger("CallStoredProcedure");
>
>      EntityManagerFactory emf =
> Persistence.createEntityManagerFactory("JPACallingOracleStoredProcedure-jpa");
>      EntityManager em = emf.createEntityManager();
>      try {
>       EntityTransaction entr = em.getTransaction();
>       entr.begin();
>       JpaEntityManager jpaEntityManager = JpaHelper.getEntityManager(em);
>       Session session = jpaEntityManager.getActiveSession();
>       StoredProcedureCall call = new StoredProcedureCall();
>       call.setProcedureName("HR.RECORD_SET.COUNTRIES_LIST");
>       call.addNamedArgumentValue("P_REGION", region);
>       call.useNamedCursorOutputAsResultSet("P_RESULTSET");
>
>
>       ObjectLevelReadQuery query = new ReadAllQuery(Country.class);
>       query.addArgument("P_REGION");
>       query.setCall(call);
>
>       List<BigDecimal> queryArgs = new ArrayList<BigDecimal>();
>       queryArgs.add(region);
>
>       return (List<Country>) session.executeQuery(query, queryArgs);
>
>      } catch (Exception ex) {
>       logger.severe("ERROR: " + ex.getMessage());
>       throw ex;
>
>      } finally {
>       em.close();
>      }
>     }
>
> }
>
> that calls an Oracle Stored Procedure
>
> And the following one,
>
> @Stateless
> @LocalBean
> public class RegionsFacade implements java.io.Serializable {
>
>  private static final long serialVersionUID = 1L;
>
>     /**
>      * Default constructor.
>      */
>     public RegionsFacade() {
>         // TODO Auto-generated constructor stub
>     }
>
>     public HashMap<String, List<String>> findAll()
>      throws EJBException {
>
>      EntityManagerFactory emf =
> Persistence.createEntityManagerFactory("JPACallingOracleStoredProcedure-jpa");
>      EntityManager em = emf.createEntityManager();
>
>      HashMap<String, List<String>> hashMap = new HashMap<String,
> List<String>>();
>
>      try {
>          javax.persistence.criteria.CriteriaQuery<Country> cq1 =
> em.getCriteriaBuilder().createQuery(Country.class);
>          cq1.select(cq1.from(Country.class));
>          List<Country> listCountries = (List<Country>)
> em.createQuery(cq1).getResultList();
>
>          javax.persistence.criteria.CriteriaQuery<Region> cq2 =
> em.getCriteriaBuilder().createQuery(Region.class);
>          cq2.select(cq2.from(Region.class));
>          List<Region> allRegions = (List<Region>)
> em.createQuery(cq2).getResultList();
>
>          for(Region r: allRegions){
>           List<String> myList = new ArrayList<String>();
>           BigDecimal myRegionId = new BigDecimal(r.getRegionId());
>           for(Country c: listCountries){
>            if((c.getRegionId()).equals(myRegionId)){
>             myList.add(c.getCountryName());
>            }
>           }
>           hashMap.put(r.getRegionName(), myList);
>          }
>      } catch(EJBException ex) {
>       throw ex;
>      } finally {
>       em.close();
>      }
>
>         return hashMap;
>     }
>
>     public HashMap<BigDecimal, String> findAllRegions()
>      throws EJBException {
>
>      EntityManagerFactory emf =
> Persistence.createEntityManagerFactory("JPACallingOracleStoredProcedure-jpa");
>      EntityManager em = emf.createEntityManager();
>
>      HashMap<BigDecimal, String> hashMap = new HashMap<BigDecimal,
> String>();
>
>      try {
>          javax.persistence.criteria.CriteriaQuery<Region> cq =
> em.getCriteriaBuilder().createQuery(Region.class);
>          cq.select(cq.from(Region.class));
>          List<Region> list = (List<Region>)
> em.createQuery(cq).getResultList();
>
>          for(Region r: list){
>           hashMap.put(new BigDecimal(r.getRegionId()), r.getRegionName());
>          }
>      } catch (EJBException ex){
>       throw ex;
>      } finally {
>       em.close();
>      }
>
>         return hashMap;
>     }
> }
>
> that uses CriteriaQuery
>
> Here is one of the exceptions they throw when do not work,
>
> javax.ejb.EJBException
>  at
> com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5194)
>  at
> com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5092)
>  at
> com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4880)
>  at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039)
>  at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990)
>  at
> com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222)
>  at
> com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
>  at $Proxy241.findAll(Unknown Source)
>  at ejb.__EJB31_Generated__RegionsFacade__Intf____Bean__.findAll(Unknown
> Source)
>  at controller.SPOutputServlet.doWork(SPOutputServlet.java:153)
>  at controller.SPOutputServlet.doPost(SPOutputServlet.java:57)
>  at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
>  at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
>  at
> org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
>  at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
>  at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>  at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
>  at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
>  at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
>  at
> com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
>  at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
>  at
> org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
>  at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
>  at
> com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:228)
>  at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
>  at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
>  at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
>  at
> com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
>  at
> com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
>  at
> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
>  at
> com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
>  at
> com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
>  at
> com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
>  at
> com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
>  at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
>  at
> com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
>  at
> com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
>  at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.IllegalArgumentException: The type [null] is not the
> expected [EntityType] for the key class [class entity.Region].
>  at
> org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.entity(MetamodelImpl.java:160)
>  at
> org.eclipse.persistence.internal.jpa.querydef.AbstractQueryImpl.from(AbstractQueryImpl.java:97)
>  at ejb.RegionsFacade.findAll(RegionsFacade.java:49)
>  at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
>  at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>  at java.lang.reflect.Method.invoke(Method.java:597)
>  at
> org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
>  at
> org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
>  at
> com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367)
>  at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
>  at
> com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
>  at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
>  at
> com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
>  at
> com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
>  at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
>  at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>  at java.lang.reflect.Method.invoke(Method.java:597)
>  at
> com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862)
>  at
> com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
>  at
> com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371)
>  at
> com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339)
>  at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327)
>  at
> com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
>  ... 32 more
>
> And this is the controller Servlet,
>
> //_at_WebServlet(name="SPOutputServlet", urlPatterns={"/SPOutputServlet"})
> public class SPOutputServlet extends HttpServlet {
>  private static final long serialVersionUID = 1L;
>  final Logger logger = Logger.getLogger("SPOutputServlet");
>
>  @EJB CallStoredProcedure callSP;
>  @EJB RegionsFacade regionsFacade;
>     /**
>      * @see HttpServlet#HttpServlet()
>      */
>     public SPOutputServlet() {
>         super();
>         // TODO Auto-generated constructor stub
>     }
>
>  /**
>   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
> response)
>   */
>  protected void doGet(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
>   // TODO Auto-generated method stub
>   doWork(request, response);
>  }
>
>  /**
>   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
> response)
>   */
>  protected void doPost(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
>   // TODO Auto-generated method stub
>   doWork(request, response);
>  }
>
>  @SuppressWarnings({ "unused", "static-access" })
>  protected void doWork(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
>   // TODO Auto-generated method stub
>
>   String allRegions = (String) request.getParameter("allregions");
>   String showModal = (String) request.getParameter("showmodal");
>
>   if(allRegions.equals("0")) {
>
>    if(showModal.equals("0")){
>
>     HashMap<BigDecimal, String> hashMap = new HashMap<BigDecimal, String>();
>     try {
>      hashMap = regionsFacade.findAllRegions();
>     } catch (Exception e) {
>      // TODO Auto-generated catch block
>      logger.severe("ERROR CALLING EJB: " + e.getMessage());
>
>      request.setAttribute("exception", e);
>      request.getRequestDispatcher("/error.jsp").forward(request, response);
>     }
>
>     request.setAttribute("regions", hashMap);
>     request.getRequestDispatcher("/oneregion.jsp").forward(request,
> response);
>
>    } else if(showModal.equals("1")) {
>
>     String strRegion = (String) request.getParameter("region");
>
>     if(strRegion != null) {
>
>      BigDecimal region = new BigDecimal(Long.parseLong((String)
> request.getParameter("region")));
>
>      List<Country> list = new ArrayList<Country>();
>      try {
>       list = callSP.getCountriesSP(region);
>      } catch (Exception e) {
>       // TODO Auto-generated catch block
>       logger.severe("ERROR CALLING EJB: " + e.getMessage());
>
>       request.setAttribute("exception", e);
>       request.getRequestDispatcher("/error.jsp").forward(request, response);
>      }
>
>      ServletOutputStream out = response.getOutputStream();
>
>      out.println("<html>");
>      out.println("<head>");
>      out.println("<title>SPOutputServlet</title>");
>      out.println("<link href='./css/default.css' rel='stylesheet'
> type='text/css' />");
>      out.println("<script language='javascript'>");
>      out.println("function goToIndex(){window.location='index.jsp';}");
>      out.println("function showModal(){");
>      out.println("var countries = new Array(");
>      int i = 0;
>      for(Country c: list){
>       if(i == list.size() - 1)
>        out.println("new Array('" + c.getCountryName() + "', '" +
> c.getCountryId() + "'));");
>       else
>        out.println("new Array('" + c.getCountryName() + "', '" +
> c.getCountryId() + "'), ");
>       i++;
>      }
>      out.println("var answer1 = window.showModalDialog('modal.html',
> countries, " +
>         "'dialogWidth:300px; dialogHeight:200px; center:yes');");
>      out.println("}");
>      out.println("</script>");
>      out.println("</head>");
>      out.println("<body>");
>      out.println("<table align='center'>");
>      int k=0;
>      for(Country c: list){
>       out.println("<tr class='tr" + (k % 2) + "'>");
>       out.println("<td class='col0'>" + c.getCountryName() + "</td>" + "<td
> class='col1'>" + c.getCountryId() + "</td>");
>       out.println("</tr>");
>       k++;
>      }
>      out.println("</table>");
>      out.println("<br/>");
>      out.println("<form>");
>      out.println("<table align='center'>");
>      out.println("<tr class='tr" + (k % 2) + "'><td class='col0'><input
> id='idIndex' type='button' value='Go to Index'
> onclick='javascript:goToIndex();'/></td>" +
>         "<td class='col1'><input id='idModal' type='button' value='Open
> Modal' onclick='javascript:showModal();'/></td></tr>");
>      out.println("</table>");
>      out.println("</form>");
>      out.println("</body>");
>      out.println("</html>");
>
>     }
>    }
>   } else if(allRegions.equals("1")){
>
>    HashMap<String, List<String>> hashMap = new HashMap<String,
> List<String>>();
>    try {
>     hashMap = regionsFacade.findAll();
>    } catch (Exception e) {
>     // TODO Auto-generated catch block
>     logger.severe("ERROR CALLING EJB: " + e.getMessage());
>
>     request.setAttribute("exception", e);
>     request.getRequestDispatcher("/error.jsp").forward(request, response);
>    }
>
>    int max = hashMap.size();
>    Set<String> set = hashMap.keySet();
>    for(String region: set)
>     max += ((List<String>) hashMap.get(region)).size();
>
>    List<String> countries = new ArrayList<String>();
>    if(showModal.equals("1")){
>     for(int h=1; h<=max; h++){
>      String country = (String) request.getParameter("f_" + h);
>      if(country != null){
>       if(!hashMap.containsKey(country))
>        countries.add(country);
>      }
>     }
>    }
>
>    request.setAttribute("showmodal", showModal);
>    request.setAttribute("countries", countries);
>    request.setAttribute("hashMap", hashMap);
>    request.getRequestDispatcher("/allregions.jsp").forward(request,
> response);
>   }
>  }
>
> }
>
> Why is this happening?