Connection para EntityManagerFactory

Tem como eu converter um java.sql.Connection para um javax.persistence.EntityManagerFactory ?

cara,

explique melhor o que vc quer fazer, explique seu cenario.

t+

Na empresa em que trabalho, não tenho flexibilidade de linguagem, esto utilizando jsp + tomcat e estou tentando implementar o JPA. Como temos acesso massivo tive que criar um pool de conexões com o DBCP que resulta em um objeto do tipo java.sql.Connection.

Esta é a classe:

import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class Intranet {

    public static DataSource conectarDataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUsername("root");
        ds.setPassword("");
        ds.setUrl("jdbc:mysql://localhost:3306/intranet");
        return ds;
    }

    public static void imprimirStatusDataSource(DataSource ds) {
        BasicDataSource bds = (BasicDataSource) ds;
        System.out.println("NumAtivos: " + bds.getNumActive());
        System.out.println("NumInativos: " + bds.getNumIdle());
    }

    public static void desligarDataSource(DataSource ds) throws SQLException {
        BasicDataSource bds = (BasicDataSource) ds;
        bds.close();
    }
}

jara eu conseguir utilizar o JPA eu preciso de um objeto do tipo EntityManagerFactory que se conecte à este pool, por isso que estou tentando converter o meu Connection em um EntityManagerFactory.

O teste já está funcional, não utilizando jpa:

public class teste {

    public static void main(String ... args){
        
        Connection conn = null;
        Statement stmt = null;
        ResultSet rset = null;
         
        try {
            conn = Intranet.conectarDataSource().getConnection();
            stmt = conn.createStatement();
            rset = stmt.executeQuery("select * from funcionario limit 20");
            int numcols = rset.getMetaData().getColumnCount();
            while(rset.next()) {
                for(int i=1;i<=numcols;i++) {
                    System.out.print("\t" + rset.getString(i));
                }
                System.out.println("");
            }
        } catch (SQLException ex) {
            Logger.getLogger(teste.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try { if (rset != null) rset.close(); } catch(Exception e) { }
            try { if (stmt != null) stmt.close(); } catch(Exception e) { }
            try { if (conn != null) conn.close(); } catch(Exception e) { }
        }
    }
}

cara,

do jeito que vc ta querendo, acho que nao vai ter jeito nao, mas vc pode criar o EntityManager independente do Connection. vc pode fazer assim

EntityManager entityManager = Persistence.createEntityManagerFactory("PERSIST_UNIT").createEntityManager();

t+

Desta forma eu não me disponho do meu pool, eu preciso utilizá-lo para acessar a base de dados. Tenho experiência com JPA, mas nunca topei com algo desse tipo, de ter que capturar um Connection e lança-lo para um EMF, eu preciso encontrar uma forma de fazê-lo.

cara,

mas vc pode configurar um Pool Conexão com Jpa (Hibernate), basta colocar nas configurações do arquivo persistence.xml.

da uma olhada nesse link,
http://www.mkyong.com/hibernate/how-to-configure-the-c3p0-connection-pool-in-hibernate/
http://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool

t+

O hibernate está sendo o que estamos querendo nos livrar kkkkk, ja utilizamos essa opção por cerca de 1 ano para nunca mais utilizar rs rs

cara,

mas o hibernate utiliza a JPA como sua implementação. Entao vc vai cair no mesmo caso.

t+

Eu to utilizando toplink pra fazer minha persistência, da muito menos problema que o hibernate kkkkk, existem várias formas de persistir com JPA, hibernate, toplink, eclipselink, etc.

toplink agora é eclipselink,

mas vc pode procurar no eclipselink que existe as mesmas configurações para ele.

t+

Estou matutando aqui e creio que a unica forma de eu conseguir fazer isso funcionar é criar um JNDI, mas não sei como fazer isso sem ser pelo context do tomcat, não quero modificar o tomcat

cara,

nao estou vendo sua dificuldade, basta vc criar o arquivo persistence.xml e configura-lo de acordo com sua necessidade e depois so usar o codigo q te passei assim para criar um entityManager.

t+

[quote=alissonvla]cara,

nao estou vendo sua dificuldade, basta vc criar o arquivo persistence.xml e configura-lo de acordo com sua necessidade e depois so usar o codigo q te passei assim para criar um entityManager.

t+[/quote]

Concordo com o colega, nao estou entendendo a dificuldade.

Voce tem o pool de conexoes. Ok.
Voce precisa criar uma conexão a partir dele. Ok.

Voce precisa utilizar o EntityManager com essa conexão atrelada ao pool. Certo. O código que o colega postou é a maneira de se fazer, basta configurar o datasource no seu persistence.xml.

O que voce nao quer é que o Tomcat gerencie o seu pool de conexões, é isso?

depois de incessante busca encontrei o que estava precisando kkkkkk. Segue o link para vocês.

assim eu não preciso me dispor de hibernate, não preciso configurar um JNDI no context do tomcat e eu uso direto o datasource que eu apontar pelo persistence-unit name

cara,

veja q vc queria uma coisa e fez outra.

mas bom que vc conseguiu resolver seu problema.

t+