2013-04-14 1 views
0

에서 엔티티를 지속하고 서블릿에서만들고 내가 만들고 서블릿에서 엔티티를 지속하기 위해 노력하고 서블릿

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

를 호출 할 때, 그건 내가 넣어지고있는 EJBException를 얻을 수있는 모든 EJB를위한 AbstractFacade의 방법을 생성한다. 이제이 메소드를 사용하여 상태 비 저장 EJB에서 엔티티를 만들고 유지하고 서블릿에서 호출하려고합니다.

public boolean createUser(JavaBean jb){}.

좋은 생각이십니까? 엔티티를 만들고 유지하는 가장 좋은 방법은 무엇입니까? 즉, 사용자 계정을 만드시겠습니까?

도움 주셔서 감사합니다.

여기에 문제가 있습니다. 데이터베이스, member_details 및 주소의 두 테이블에 레코드를 만들고 싶습니다. 그들은 일대일 관계가 있습니다. 관계는 아직 데이터베이스의 외래 키에 의해 시행되지 않습니다. 두 테이블 모두 해당 엔티티 클래스가 있고 엔티티 클래스 Address에는 복합 기본 키를 나타내는 Embeddable 클래스 AddressPK가 있습니다. 일대일 관계는 엔티티에서 주소가 @ JoinColumn(name = "MEMBER_ID")이고 주소가 @OneToOne(mappedBy = "memberId", cascade = CascadeType.ALL) 인 MemberDetails`에서만 적용됩니다. 이제는 JSP 형식의 데이터와 JavaBean을 다른 JSP로 설정합니다. 서블릿은 엔티티를 생성하고 주입 된 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를 함께 삽입 할 때 예외가 있습니다.

WARNING : EJB5184는 : com.sun.ejb.containers시에 javax.ejb.EJBException : WARNING 공개 무효 beans.MemberDetailsFacade.create (entities.MemberDetails) 시스템 예외는 EJB MemberDetailsFacade, 메소드 호출시에 발생한 .BaseContainer.processSystemException (BaseContainer.java:5215) com.sun.ejb.containers.BaseContainer.completeNewTx (BaseContainer.java:5113) at com.sun.ejb.containers.BaseContainer.postInvokeTx (BaseContainer.java:4901)) at com.sun.ejb.containers.BaseContainer.postInvoke (BaseContainer.java:2045) at com.sun.ejb.containers.BaseContainer.postInvoke (BaseContainer.java:1994) at com.sun.ejb.containers .EJBLocalObjectInvocati onHandler.invoke (EJBLocalObjectInvocationHandler.java:222) 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) at org.apache. org.apache.catalina.core.StandardWrapper.service (StandardWrapper.java:1550) 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 org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java) : 161) 에서 org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java : 331) at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call (ContainerMapper.java:317) com.sun.grizzly.http.ProcessorTask.invokeAdapter에서 com.sun.enterprise.v3.services.impl.ContainerMapper.service (ContainerMapper.java:195) (ProcessorTask.java:860)이 com.sun에서 에서 . grizzly.http.ProcessorTask.doProcess (ProcessorTask.java:757) com.sun.grizzly.http.ProcessorTask.process (ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute (DefaultProtocolFilter. java : 229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter (DefaultProtocolChain.java:137) at com.sun.grizzly.Defaul com.sun.grizzly.http.HttpProtocolChain.execute에서 com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:90) 에서 tProtocolChain.execute (DefaultProtocolChain.java:104) (HttpProtocolChain.java:79)에서 (ContextTask.java : com.sun.grizzly.ProtocolChainContextTask.doCall) 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:722) 에 의해 발생 : javax.validation.UnexpectedTypeException : HV000030 : entity.MemberDetails 유형의 유효성 검사기를 찾을 수 없습니다. ...

+1

, 당신은 우리에게 예외의 스택 트레이스를 표시해야합니다 관련 코드 –

+0

엔티티 만 유지하는 EJB를 정의 할 필요는 없습니다. 오류에 대한 자세한 내용을 표시하십시오 – gcvt

+0

엔티티를 선언하고 있습니까? EJB로? –

답변

0

정확히 무엇을 하려는지 명확하지 않지만 entitymanager를 캡슐화하는 상태 비 저장 EJB를 사용하는 것이 가장 좋습니다.

이러한 EJB는 스레드 안전 문제를 걱정할 필요없이 Servlet에 주입 할 수 있습니다.

서블릿에서 직접 엔티티 관리자를 사용하는 경우 이러한 문제를 인식해야합니다 (엔티티 관리자는 스레드로부터 안전하지 않으며 모든 요청에 ​​대해 서블릿 인스턴스가 1 개뿐이며 트랜잭션을 수동으로 관리해야합니다. 모든 복잡성 그냥 사라집니다 간단하고 가벼운 EJB 빈으로

. 정확히 묻는거야? 당신은 당신이 넣어지고있는 EJBException를 얻을 이유를 이해하려면

+0

예, EJB에 캡슐화 된 엔티티 관리자가 있습니다. 주입 된 EJB의 서블릿에서 EJB로 구현 된 추상 클래스의 메소드 인'create()'메소드를 호출합니다. –