Problemas de Persistence Unit com Ejb3 em Jar separados

5 respostas
R

Pessoal,
procurei mas não econtrei nada sobre o meu problema que é o seguinte:

A minha aplicação vai gerar um EAR com a estrutura

EAR lib entity1.jar (entities, interfaces facades1 e persistence.xml) entity2.jar (entities, interfaces facades2) facades1.jar (session bean) facades2.jar (session bean) aplicacao.war

Como podem ver eu preciso separar os EJBs em mais de um jar,
então eu estou usando esse recurso de colocar os entities, interfaces e persistence.xml dentro do lib para ficar disponível para todo o EAR.

Eu uso JDeveloper e tenho os projetos separados, o facades2.jar vai com lib do projeto principal e vai pro EAR.

Rodando no servidor (testei no Glassfish) funciona beleza, o Persistence Unit fica disponivel para o facades2.jar também,
porém rodando na IDE ele não está tornando global o Persistence Unit e os Session Bean do facades2.jar não conseguem receber o EntityManager (estou usando @PersistenceContext).

E ai, alguém pode me dar uma dica? Existe alguma forma de fazer isso, ou o que estou tentando é inviável? Será que é um problema específico da maneira como o JDeveloper executa a aplicação?

Valeu pessoal.

5 Respostas

A

Qual erro?

Sempre que falar de algum erro, coloque-o… :wink:

R

Foi mal, segue o erro:

javax.ejb.EJBException: Error looking up reference PersistenceUnit: Banco; nested exception is: java.lang.InstantiationException: Error looking up reference PersistenceUnit: Banco at com.evermind.server.ejb.EJBUtils.createEJBException(EJBUtils.java:146) at com.evermind.server.ejb.EJBUtils.createEJBException(EJBUtils.java:137) at com.evermind.server.ejb.LifecycleManager.postConstruct(LifecycleManager.java:104) at com.evermind.server.ejb.StatelessSessionBeanPool.createContextImpl(StatelessSessionBeanPool.java:41) at com.evermind.server.ejb.BeanPool.createContext(BeanPool.java:419) at com.evermind.server.ejb.BeanPool.allocateContext(BeanPool.java:246) at com.evermind.server.ejb.StatelessSessionEJBObject.OC4J_invokeMethod(StatelessSessionEJBObject.java:103) at br_com_teste_facade_Usuario_RemoteProxy_nk5lnc.login(Unknown Source) at br.com.teste.view.Login.actionLogin(Login.java:109) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.sun.el.parser.AstValue.invoke(AstValue.java:151) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:95) at javax.faces.component.UICommand.broadcast(UICommand.java:383) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:448) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:248) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65) at br.com.teste.FilterSessao.doFilter(FilterSessao.java:42) at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15) at br.com.teste.Filter.doFilter(Filter.java:43) at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:617) at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:368) at com.evermind.server.http.HttpRequestHandler.doDispatchRequest(HttpRequestHandler.java:889) at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:797) at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:607) at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:376) at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:161) at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:142) at oracle.oc4j.network.ServerSocketReadHandler$ClientRunnable.run(ServerSocketReadHandler.java:275) at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:237) at oracle.oc4j.network.ServerSocketAcceptHandler.access$800(ServerSocketAcceptHandler.java:29) at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:878) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) at java.lang.Thread.run(Thread.java:595) Caused by: java.lang.InstantiationException: Error looking up reference PersistenceUnit: Banco at com.evermind.server.DependencyManager.resolveDependencies(DependencyManager.java:163) at com.evermind.server.ejb.LifecycleManager.postConstruct(LifecycleManager.java:99) ... 40 more Caused by: javax.naming.NameNotFoundException: java:comp/env/Banco not found at com.oracle.naming.J2EEContext.getSubContext(J2EEContext.java:198) at com.oracle.naming.J2EEContext.lookup(J2EEContext.java:145) at com.evermind.server.ApplicationContext.lookupInJavaContext(ApplicationContext.java:305) at com.evermind.server.ApplicationContext.unprivileged_lookup(ApplicationContext.java:229) at com.evermind.server.ApplicationContext.lookup(ApplicationContext.java:194) at javax.naming.InitialContext.lookup(InitialContext.java:351) at com.evermind.server.DependencyManager.resolveDependencies(DependencyManager.java:161)

A

Se vc está rodando na IDE, provavelmente está rodando em modo standalone. Vc precisa configurar o persistence.xml de outra maneira. Assim, por exemplo:

<persistence-unit name="xpto">

       <!-- jar-file>./target/classes</jar-file -->
       <jar-file>../Agenda/target/classes</jar-file>
	  
       <properties>
          <!-- Only scan and detect annotated entities -->
          <property name="hibernate.archive.autodetection" value="class"/>
 		  <!-- property name="hibernate.connection.url" value="jdbc:mysql://200.xxx.xxx.xxx:3306/soa_teste"/ -->
   		  <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/soa_teste"/>
      	  <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
	   	  <property name="hibernate.connection.username" value="site_soa"/>
	      <property name="hibernate.connection.password" value="123"/>
          <property name="hibernate.dialect"  value="org.hibernate.dialect.MySQL5Dialect"/>
          <property name="hibernate.hbm2ddl.auto" value="create"/>          
          <property name="hibernate.format_sql" value="true"/>
          <property name="use_sql_comments" value="true"/>
      </properties>
   </persistence-unit>
   
</persistence>
R

O que você quer dizer com modo standalone?
A parte do persistence.xml que você quiz me indicar é o ?
Eu já faço mais ou menos isso, usando o elemento . Eu referencio todas as Entities do facade2.jar no meu persistence.xml, e acho isso está ok.

Não sei se ficou bem claro o problema. Eu tenho um jar com Session Beans mas que não possui um persistence.xml.
Então esses beans precisam “enxergar” o Persistence Unit definido no outro projeto, que usa esse jar. Já tentei fazer e injeção do EM por anotação e por ejb-jar.xml da no mesmo.

É normal isso? algum já fez algo assim? (no servidor funciona o problema é na IDE)

Obrigado pela resposta.

R

Galera funcionou.

Tive que incluir todos os ebjs no mesmo ejb-jar.xml, outra coisa muito estranha é que o projeto que gera o facade2.jar estava no mesmo workspace do JDevelper, e de alguma forma ele estava usando esses fontes mesmo sem existir dependencia entre eles, então foi preciso separar o projeto.

Criado 17 de agosto de 2007
Ultima resposta 22 de ago. de 2007
Respostas 5
Participantes 2