ejb@glassfish.java.net

Re: Strange issue

From: Jose Alvarez de Lara <dakhla.0563_at_hotmail.com>
Date: Sun, 10 Apr 2011 22:04:40 +0200

Hi Chase,

I have got the page.

Thanks a lot,
Jose

--------------------------------------------------
From: "Chase" <chase_at_osdev.org>
Sent: Sunday, April 10, 2011 8:51 PM
To: <ejb_at_glassfish.java.net>
Subject: Re: Strange issue

> 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?
>