2013-06-07 20 views
11

Ho un'applicazione funzionante in cui utilizzo Java EE 6 con EclipseLink per la persistenza e un database PostgreSQL.Come ottenere DataSource o Connessione da JPA2 EntityManager in Java EE 6

Per l'utente-registrazione voglio impostare la password in PostgreSQL:

... password = crypt('inputPassword',gen_salt('bf')) ... 

Come ho cant utilizzare DigestUtils per questo, devo inserire manualmente l'utente nel DB. Per mantenere la mia domanda configurabile Non voglio interrogare il DataSource con una InitialContextInstance.lookup(dataSource) ma per estrarlo (o la connessione) in qualche modo dal EntityManager come:

DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection(); 

o sarebbe possibile utilizzare createNativeQuery o qualcosa di simile nella congiunzione con una dichiarazione preparata per la protezione contro le iniezioni?

+0

Se utilizzare un'origine dati per la configurazione JPA, dovresti essere in grado di ottenere l'accesso ad esso usando un '@Resource (name =" myDb ") DataSource myDB'. Non è così? E penso che sia possibile definire query parametrizzate anche con JPA. –

+0

sì, potrebbe funzionare, ma devo ancora sapere il nome. Voglio ottenere il DataSource predefinito configurato per un EntityManager iniettato. – zuloo

risposta

15

A volte ci vuole solo un altro run in google:

entityManager.getTransaction().begin(); 
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); 
... 
entityManager.getTransaction().commit(); 

come descritto nella Eclipse Link Documentation

+5

È quella parte dello standard. Sembra essere specifico per Eclipselink –

+0

c'è un modo per ottenere la password da questa connessione –

+2

Non funziona in stato di ibernazione. – okwap

4

In risposta a "Archimede Trajano" commento alla risposta accettata, fa il lavoro risposta accettata per diverso EclipseLink? La risposta è no per almeno Hibernate.

ho ottenuto il seguente errore quando ho provato la risposta accettata per Hibernate:

Caused by: org.springframework.orm.jpa.JpaSystemException: Hibernate cannot unwrap interface java.sql.Connection; nested exception is javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connection 
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:418) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE] 

Una combinazione di risposte dalle seguenti domande StackOverflow mi ha permesso di trovare una soluzione che funziona per Hibernate.

Get hold of a JDBC Connection object from a Stateless Bean

Hibernate get Connection object for JasperRunManager

Ecco la mia soluzione:

Session hibernateSession = entityManager.unwrap(Session.class); 

    hibernateSession.doWork(new org.hibernate.jdbc.Work() { 

     @Override 
     public void execute(Connection connection) throws SQLException { 
      // do whatever you need to do with the connection 
     } 
    }); 
0

Ecco un frammento di codice che funziona con Hibernate 4, in base alla risposta del Dulon

Connection getConnection() { 
     Session session = entityManager.unwrap(Session.class); 
     MyWork myWork = new MyWork(); 
     session.doWork(myWork); 
     return myWork.getConnection(); 
} 


private static class MyWork implements Work { 

    Connection conn; 

    @Override 
    public void execute(Connection arg0) throws SQLException { 
     this.conn = arg0; 
    } 

    Connection getConnection() { 
     return conn; 
    } 

} 
Problemi correlati