2013-06-07 18 views
11

Mam działającą aplikację, w której używam Java EE 6 z EclipseLink do trwałości i bazy danych PostgreSQL.Jak uzyskać DataSource lub połączenie z JPA2 EntityManager w Java EE 6

dla użytkownika-Rejestracji Chcę ustawić hasło w PostgreSQL:

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

Ponieważ nie mogę używać DigestUtils do tego, muszę wstawić użytkownikowi ręcznie w DB. Aby zachować mój wniosek konfigurowalne Nie chcę kwerendy DataSource z krytym InitialContextInstance.lookup(dataSource) ale żeby go (lub połączenia), wyciąg jakoś z EntityManager jak:

DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection(); 

Albo byłoby możliwe użycie createNativeQuery lub coś podobnego w połączeniu z z przygotowanym oświadczeniem w celu ochrony przed zastrzykami?

+0

jeśli użyj źródła danych do konfiguracji JPA, powinieneś mieć możliwość uzyskania dostępu do tego przy użyciu '@Resource (name =" myDb ") DataSource myDB'. Czy nie tak? I myślę, że możesz również zdefiniować sparametryzowane zapytania z JPA. –

+0

tak, to może zadziałać, ale nadal muszę znać nazwę. Chcę uzyskać skonfigurowany domyślny DataSource dla wstrzykniętego EntityManager. – zuloo

Odpowiedz

15

czasami po prostu ma inny bieg w Google:

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

jak opisano w Eclipse Link Documentation

+5

Czy to część normy. Wydaje się być specyficzne dla Eclipselink –

+0

czy istnieje sposób na uzyskanie hasła z tego połączenia? –

+2

Nie działa w hibernacji. – okwap

4

W odpowiedzi na „Archimedes Trajano” komentarz do przyjętej odpowiedź, czy przyjętej pracę odpowiedzi dla innych niż Eclipselink? Odpowiedź brzmi: nie dla co najmniej hibernacji.

mam następujący błąd, gdy próbowałem zaakceptowane odpowiedź na Hibernacja:

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] 

Połączenie z odpowiedziami na następujące pytania StackOverflow pozwoliła mi wymyślić rozwiązanie, które działa na Hibernate.

Get hold of a JDBC Connection object from a Stateless Bean

Hibernate get Connection object for JasperRunManager

Oto moje rozwiązanie:

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

Oto fragment kodu, który współpracuje z Hibernate 4, na podstawie Dulon za odpowiedź

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; 
    } 

}