Erro de Datasource com JPA no Eclipse

5 respostas
J

Pessoal, estou com o seguinte problema:

  1. Sou iniciante na tecnologia EJB3 e JPA, no JBoss com Hibernate e Oracle XE.

  2. Construi uma classe de teste para executar a partir do Eclipse, conforme abaixo:

[i]package com.wd;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

public class Teste {

/**
 * @param args
 */
public static void main(String[] args) {
	
	   
    
	
	// TODO Auto-generated method stub
	EntityManagerFactory emf = Persistence.createEntityManagerFactory("patientPU");
	EntityManager em = emf.createEntityManager();
	em.getTransaction().begin();
	
	Patient pat = new Patient();
	pat.setName("Pedro");
		
	em.persist(pat);
	em.getTransaction().commit();
	em.close();
	emf.close();
	
	System.out.println("Paciente persisitido com id "+pat.getId());
	
}

}[/i]

  1. a configuracão do arquivo persistence.xml para acessar o BD Oracle XE é a seguinte:

[i]<?xml version=“1.0” encoding=“UTF-8”?>
<persistence xmlns=“http://java.sun.com/xml/ns/persistence
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=“http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
version=“1.0”>

&lt;persistence-unit name="patientPU" transaction-type="RESOURCE_LOCAL"&gt;
&lt;non-jta-data-source&gt;java:/OracleDS&lt;/non-jta-data-source&gt;
	&lt;properties&gt;
		&lt;property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /&gt;
		&lt;property name="hibernate.connection.url" value="jdbc:oracle:thin:@home:1521:XE" /&gt;
		&lt;property name="hibernate.connection.username" value="adm" /&gt;
		&lt;property name="hibernate.connection.password" value="xyz" /&gt;

		&lt;property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /&gt;
	&lt;/properties&gt;
&lt;/persistence-unit&gt;

</persistence>[/i]

  1. meu oracle-ds.xml está assim:
[i]<?xml version="1.0" encoding="UTF-8"?>

<datasources>

<local-tx-datasource>

<jndi-name>OracleDS</jndi-name>

<connection-url>jdbc:oracle:thin:<a class="mention" href="/u/home">@home</a>:1521:XE</connection-url>

<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>

<user-name>admin</user-name>

<password>xyz</password>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>

<metadata>

<type-mapping>OracleXE</type-mapping>

</metadata>

</local-tx-datasource>

</datasources>[/i]

  1. estou com conseguindo “subir” o jboss sem mensagens de erro, ou seja, aparentemente o servidor e suas conexões com o BD estão OK.

  2. no entanto ao executar a classe teste de dentro do Eclipse aparece o erro abaixo:

log4j:WARN No appenders could be found for logger (org.hibernate.ejb.Version).

log4j:WARN Please initialize the log4j system properly.

Exception in thread main javax.persistence.PersistenceException: org.hibernate.HibernateException: Could not find datasource

at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:720)

at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)

at com.wd.Teste.main(Teste.java:13)

Caused by: org.hibernate.HibernateException: [color=red]Could not find datasource[/color]

at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:56)

at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)

at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)

at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)

at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)

at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)

 4 more

Caused by: javax.naming.NameNotFoundException: OracleDS not bound

at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)

at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)

at org.jnp.server.NamingServer.getObject(NamingServer.java:543)

at org.jnp.server.NamingServer.lookup(NamingServer.java:296)

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 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)

at sun.rmi.transport.Transport$1.run(Transport.java:153)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:149)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)

at java.lang.Thread.run(Thread.java:595)

at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)

at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)

at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)

at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:589)

at javax.naming.InitialContext.lookup(InitialContext.java:351)

at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)

 10 more
  1. estou há muitas noites sem resolver esse problema, por favor alguém pode ajudar?

5 Respostas

R
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
                                      <!-- aqui coloque o nome que quiser -->
  <persistence-unit name="AppPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

       <!-- aqui a lista dos pojos que vai persistir -->
    <class>app.pojo.Team</class>
    <class>app.pojo.User</class>
    <class>app.pojo.Permission</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
          <!-- aqui as propriedades de acesso -->
      <property name="hibernate.connection.username" value="adm"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.password" value="masterkey02"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost/planoa_db"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
    </properties>
  </persistence-unit>
</persistence>

remove essa referência ao datasource ( não sei qual o motivo que o levou a usa-lo ) e elimina o arquivo de configuracao dele…faça as adaptações para uso com o oracle ( o exemplo que coloquei é para mysql ) e verifique se funciona ( aqui comigo tá tudo certo ).

espero que ajude.

G

Eu tive um problema parecido, mas eu usava o Tomcat. Não esquece de colocar a pasta META-INF na raiz das classes e não na META-INF que é criada no servidor web (tomcat).

Editado: desculpa, me confundi. pensei que estava usando jpa. achei o xml tão parecido que nem li os names. perdão.

J

Rafael,
O motivo para colocar a referência ao datasource é que ao colocar a tag
transaction-type=“RESOURCE_LOCAL”>…, o servidor exige a tag non-jta-data-source.
Fiz novamente a experiência de tirar a referência ao datasource, conforme tu sugeriu
e obtive novamente o erro abaixo:

— MBeans waiting for other MBeans —
ObjectName: persistence.units:unitName=patientPU
State: FAILED
Reason: java.lang.RuntimeException: You have not defined a non-jta-data-source
for a RESOURCE_LOCAL enabled persistence context named: patientPU

— MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM —
ObjectName: persistence.units:unitName=patientPU
State: FAILED
Reason: java.lang.RuntimeException: You have not defined a non-jta-data-source
for a RESOURCE_LOCAL enabled persistence context named: patientPU

R

vc copiou o xml que postei e alterou para a sua necessidade? repare que no seu xml não indica o uso do provider…copia ai e altera somente nos locais necessarios.

J

Quando relatei que eu havia feito a experiência de retirar a referência ao datasource, eu havia
feito a cópia do teu arquivo e alterado somente as questões necessárias.
Tá parecendo que o problema não está na configuração do xml e sim no fato de eu estar tentando acessar
a partir de um cliente de dentro do eclipse e que por algum motivo, este cliente, não acha o datasource.
De qualquer forma, muito obrigado pela tua ajuda.

Criado 22 de outubro de 2007
Ultima resposta 4 de nov. de 2007
Respostas 5
Participantes 3