Hibernate JPA + JBOSS + ORACLE usando um DATASOURCE usando JTA

Java

08/09/2011

Amigos,

Ah muito tempo venho batendo cabeça tentando fazer funcionar esse negocio e não consigo, cansado de tanto bater cabeça e não achar solução resolvi recorrer a vcs, mestres do conhecimento java. Minha situação é a seguinte, estou tentando implementar uma conexão atraves de um DataSource q esta configurado no JBoss e que estou tentando usar o hibernate com padrão JPA para receber a conexão e deixar o container gerenciar tudo.

Criei um arquivo Oracle-DS.xml que salvei na pasta C:\jboss-5.0.0.CR2\server\default\deploy do Jboss. O que estou usando é o Jboss 5.0.

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@localhost:1521:xe</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>welcome</user-name>
    <password>welcome</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>

Na minha aplicação configurei o arquivo persistenci.xml assim:

<?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">
    <persistence-unit name="jpajsfteste">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/OracleDs</jta-data-source>
        <class>br.fucapi.beans.Author</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>
</persistence>  

to tentando abrir uma simples conexão primeiramente então criei uma classe main que vai chamar essa configuração e na pratica era para me retornar uma conexão gerenciada pelo container Jboss:


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.NotSupportedException;

public class Test {

    public static void main(String[] args) throws NotSupportedException,Exception {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpajsfteste");
        EntityManager em = emf.createEntityManager();
        em.close();
        emf.close();
    }

}

so que o mesmo esta dando um erro:

ERROR DatasourceConnectionProvider:246 - Could not find datasource: java:/OracleDs

Agradeço a todos que puderem ajudar, valeu e Obrigado!!!


Fabiano Farah

Fabiano Farah

Curtidas 0

Respostas

Robson Teixeira

Robson Teixeira

08/09/2011

no seu persistence.xml acrestente o seguinte parametro
<persistence-unit name="jpajsfteste" transaction-type="JTA">

e outra coisa quando você usa um data-source o container que deve instancia e injetar o EntityManager em seu codigo java e você não deve criar o entityManager como você ta fazendo ok??

espero ter ajudado
att
 robson
GOSTEI 0
Fabiano Farah

Fabiano Farah

08/09/2011

ROBSON,

 Gostaria de agradeçer as dicas, mas desculpe minha ignorancia mas como faço para injetar a instancia do próprio container? Eu uso o annotation @inject em cima de uma variavel EntityManager ? mais uma vez obrigado!!
GOSTEI 0
Robson Teixeira

Robson Teixeira

08/09/2011

Pode usar a @Inject ou a que uso mais a @PersistenceContext se tiver usando o jboss-weld no seu projeto sugiro a @Inject

exemplo

public class MyPersistence{
      @Inject
      private EntityManager em;
}

ou

public class MyPersistence{
      @PersistenceContext
      private EntityManager em;
}

espero ter ajudado
att
 robson
GOSTEI 0
Dyego Carmo

Dyego Carmo

08/09/2011

tentou acessar "jdbc/OracleDS" no lugar de apenas "OracleDS" ?

GOSTEI 0
Fabiano Farah

Fabiano Farah

08/09/2011

ROBSON meu grande eu tentei fazer o teste do jeito que vc me indicou, mas não obtive exito :( Eu coloquei esse código de teste:

package br.fucapi.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.HibernateException;
import br.fucapi.beans.Author;

public class TestandoAuthor {

    @PersistenceContext(unitName = "jpajsfteste")
    protected EntityManager entityManager;

    public void createAuthor(Author aut) {

        try {

            entityManager.merge(aut);

        } catch (HibernateException e) {

            e.getStackTrace();

        } finally {

            entityManager.close();
        }

    }

    public static void main(String[] args) {

        TestandoAuthor teste = new TestandoAuthor();
        Author author = new Author();
        author.setName("Fabiano2");
        author.setEmail("fabiano2@teste.br");
        teste.createAuthor(author);

    }

}

Esse é o erro que esta me retornando:

Exception in thread "main" java.lang.NullPointerException
    at br.fucapi.daos.TestandoAuthor.createAuthor(TestandoAuthor.java:25)
    at br.fucapi.daos.TestandoAuthor.main(TestandoAuthor.java:36)

So por incargo de conciencia eu fiz um teste usando a conexão e transação gerenciados pela a aplicação e funcionou normalmente, mas quando tento configurar para rodar pelo Jboss ai da o problema. Eu ja consegui implementar a conexão pelo servidor usando JDBC puro e quando implementei as classes usando EJB so que gostaria de implementar sem usar EJB ja que estou pensando em usar uma aplicação não distribuida mas que ira ter um grande volume de informações recebidas e geradas, quero controlar tudo pelo servidor.

Diego meu grande, vc é gente boa, tenho várias vídeo aulas suas sobre Hibernate e de JPA com JSF, vc é o cara!!! Oh Diego eu usei o jdbc/OracleDS mas tb continua dando o mesmo erro q o de cima, oq estou fazendo de errado?

Agradeço a todos, esse problema vem me tirando maior tempão, a semanas tento resolve-lo!!!

GOSTEI 0
Robson Teixeira

Robson Teixeira

08/09/2011

Quando você da run na classe TestandoAuthor  o Jboss ja está Inicializado???? e sugiro você usar EJB para que o Jboss injete a instancia do EntityManager e fazer uso do metodo lookup que traz a instancia do EJB Exemplo @Stateless public class TestandoAuthor {

    @PersistenceContext(unitName = "jpajsfteste")
    protected EntityManager entityManager;

    public void createAuthor(Author aut) {

        try {

            entityManager.merge(aut);

        } catch (HibernateException e) {

            e.getStackTrace();

        } finally {

            entityManager.close();
        }

    }

    public static void main(String[] args) {
        TestandoAuthor teste = (TestandoAuthor)new InitialContext().lookup("Passar o id do EJB registrado no JBOSS");         Author author = new Author();
        author.setName("Fabiano2");
        author.setEmail("fabiano2@teste.br");
        teste.createAuthor(author);

    }

}

qualquer coisa é so chamar att  robson
GOSTEI 0
Robson Teixeira

Robson Teixeira

08/09/2011

Descupe por não ter lido direito (acontece nas melhores familias)
e eu so consigo imaginar 2 soluções uma seria usar o spring framerwork para fazer o controle das transações onde o mesmo pode ler o seu arquivo DS ou invocar o metodo lookup mas para obter um objeto do tipo DataSource. São as soluções que julgo mais viaveis.
 att
   robson
GOSTEI 0
Fabiano Farah

Fabiano Farah

08/09/2011

ROBSON PASSARELLA TEIXEIRA

Vou tentar fazer oq vc me disse Robson, depois postarei o resultado. Valeu!!
GOSTEI 0
Robson Teixeira

Robson Teixeira

08/09/2011

resolvido?? se sim favor fechar post.
GOSTEI 0
Dyego Carmo

Dyego Carmo

08/09/2011

Está dando o NULLL pointer ou o "datasource not found" ?

GOSTEI 0
POSTAR