JPA e PostgreSQL
-
20-09-2019 - |
Pergunta
Estou em um projeto que usa a implementação do JPA Eclipselink para conversar com um banco de dados PostgreSQL. Eu tenho uma tarefa para a qual o PostgreSQL notificar/ouvir parece ser um ajuste perfeito. Infelizmente, sou um JPA Newb e estou lutando para descobrir como fazê -lo funcionar. Então, acho que realmente tenho duas perguntas; Responder qualquer um vai me deixar feliz.
1) Qual é a melhor maneira de conseguir a conexão direta do JDBC com o banco de dados? (Que eu sinceramente espero que seja do tipo org.postgresql.PGConnection
.)
OU
2) Qual é a melhor maneira de eu imitar/acessar org.postgresql.PGConnection.getNotifications()
via EclipSelink JPA?
Muito obrigado pela sua ajuda.
Editar: Duas soluções de trabalho! Eu amo este site. Se alguém tiver algo a dizer sobre o Hidden Gotchas/benefícios que tornariam a solução de Pascal ou Balus melhor do que a outra antes de distribuir a marca de seleção, gostaria de ouvi -la.
Solução
Obtendo uma conexão JDBC de um EntityManager
no eclipselink é respondido no Eclipselink Wiki.
A maneira difere por versão da API JPA. Aqui está um extrato do wiki:
JPA 2.0
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
JPA 1.0
entityManager.getTransaction().begin();
UnitOfWorkImpl unitOfWork = (UnitOfWorkImpl)((JpaEntityManager)entityManager.getDelegate()).getActiveSession();
unitOfWork.beginEarlyTransaction();
java.sql.Connection connection = unitOfWork.getAccessor().getConnection();
...
entityManager.getTransaction().commit();
Outras dicas
Você deve ser capaz de obtê -lo de org.eclipse.persistence.internal.jpa.EntityManagerImpl
que é devolvido por EntityManager.getDelegate()
:
java.sql.Connection conn = ((EntityManagerImpl)(em.getDelegate())).getServerSession().getAccessor().getConnection();