从servlet创建和持久化实体

时间:2013-04-14 16:20:53

标签: java-ee servlets persistence entity ejb-3.1

我正在尝试在servlet中创建并持久化实体,并在调用

public void create(T entity) { getEntityManager().persist(entity); }

来自servlet的

,这是AbstractFacade中为所有EJB生成的方法,我得到了EJBException。现在,我正在考虑使用此方法在无状态EJB中创建和持久化实体,并从servlet

中调用它

public boolean createUser(JavaBean jb){}

这是个好主意吗?创建和持久化实体的最佳方法是什么,即创建用户帐户?

感谢您的帮助。

这是问题所在。 我想在数据库,member_details和address中的两个表中创建记录。他们有一对一的关系。该关系不是由数据库中的外键强制执行的。两个表都有对应的实体类,实体类Address具有表示其复合主键的Embeddable类AddressPK。一对一关系仅在地址中的@ JoinColumn(name = "MEMBER_ID")和MemberDetails中的@OneToOne(mappedBy = "memberId", cascade = CascadeType.ALL)强制执行。现在,我从JSP表单获取数据,并在另一个JSP中设置JavaBean。 Servlet创建实体并调用注入的EJB来保存它们,如下所示:

        //get MemberBean from session object
    MemberBean member = (MemberBean) request.getSession().getAttribute("user");
    //create relevant entities and set attributes of entity classes
    MemberDetails aMember = new MemberDetails("M3", firstName, middleName, lastName, dob, phoneNo,
            member.getEmail(), gender, industryPosition, "Basic", musicInterests);
    AddressPK addressId = new AddressPK(houseNo, postCode);
    Address anAddress = new Address(addressId, street, county, town, country, aMember);
    aMember.setAddress(anAddress);


    if (memberDetails.find(aMember.getMemberId()) == null) {
        //address.create(anAddress);

        memberDetails.create(aMember);

    }
    else
    { System.out.println("User M3 Exists");}

    //tests
    memberDetails.displayMembers();

    RequestDispatcher disp = request.getRequestDispatcher("WEB-INF/jsp/accounttype.jsp");
    disp.forward(request, response);

我创建了普通的Java应用程序客户端,并使用显式事务插入了这些详细信注释掉地址并仅保留MemberDetails时,它也有效。

这是我在尝试一起插入MemberDetails和Address时遇到的异常。

警告:EJB5184:在EJB MemberDetailsFacade上调用期间发生系统异常,方法:public void beans.MemberDetailsFacade.create(entities.MemberDetails) 警告:javax.ejb.EJBException     at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215)     at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113)     at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901)     在com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045)     at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994)     at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222)     at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89)     在sun.proxy。$ Proxy233.create(未知来源)     在servlets.NewAccountFormHandler.doPost(NewAccountFormHandler.java:137)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:688)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:770)     在org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)     在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)     在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)     在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)     在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)     在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)     在org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)     在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)     at com.sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call(ContainerMapper.java:317)     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)     在com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)     在com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)     在com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)     在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)     在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)     在com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)     在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)     在com.sun.grizzly.ContextTask.run(ContextTask.java:71)     at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532)     在com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513)     在java.lang.Thread.run(Thread.java:722) 引起:javax.validation.UnexpectedTypeException:HV000030:找不到类型为:entities.MemberDetails的验证器。     ...

1 个答案:

答案 0 :(得分:0)

您不清楚自己要做什么,但使用封装了实体管理器的无状态EJB确实是最佳做法。

这样的EJB可以注入到Servlet中,而不必担心线程安全问题。

如果你直接在Servlet中使用实体管理器,你必须知道这些问题(实体管理器不是线程安全的,并且所有请求只有1个Servlet实例。你还需要手动管理交易。

使用简单轻量级的EJB bean,所有这些复杂性都会消失。