2010-01-14 9 views
4

Je suis sur un projet qui utilise l'implémentation EclipseLink de JPA pour communiquer avec une base de données PostgreSQL. J'ai une tâche pour laquelle PostgreSQL NOTIFY/LISTEN semble être un ajustement parfait. Malheureusement, je suis un newb JPA, et j'ai du mal à comprendre comment le faire fonctionner. Donc je suppose que j'ai vraiment deux questions; répondre à l'un ou l'autre me rendra heureux.JPA et PostgreSQL

1) Quelle est la meilleure façon pour moi de mettre la connexion JDBC directe à la base de données? (Qui je l'espère sincèrement se révélera être de type org.postgresql.PGConnection.)

OU

2) Quelle est la meilleure façon pour moi de Emuler/accès org.postgresql.PGConnection.getNotifications() via EclipseLink JPA?

Merci beaucoup pour votre aide.


Édition: Deux solutions de travail! J'aime ce site. Si quelqu'un a quelque chose à dire sur les pièges/avantages cachés qui feraient mieux la solution de Pascal ou de Balus que l'autre avant de distribuer la coche, j'aimerais l'entendre.

Répondre

7

L'obtention d'une connexion JDBC à partir d'un EntityManager dans EclipseLink est résolue dans EclipseLink wiki.

Le chemin diffère selon la version de l'API JPA. Voici un extrait du 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(); 
+0

Fonctionne bien, merci! (Et je pense que je suis tombé sur Google plus tôt, je ne sais pas comment j'ai réussi à ne pas l'implémenter.) Y at-il des pièges/avantages inédits qui rendraient cela meilleur que la solution de Pascal? – BlairHippo

+0

Quelle version de l'API JPA utilisez-vous? Si 2.0, alors je choisirais définitivement le 'EntityManager # unwrap()'. Si 1.0, alors je trouve personnellement la solution de Pascal plus claire/plus agréable, mais je ne suis pas sûr que cela retournera toujours une connexion de travail car vous êtes en dehors de la Transaction/UnitOfWork alors. Sinon, il serait décrit comme dans Wiki d'EclipseLink. – BalusC

+0

J'utilise actuellement la version 1.0, mais s'il y a des soupçons que Pascal ne fonctionne pas toujours, c'est celui avec lequel je dois aller. Merci beaucoup pour votre aide. – BlairHippo

2

Vous devriez pouvoir obtenir de org.eclipse.persistence.internal.jpa.EntityManagerImpl retourné par EntityManager.getDelegate():

java.sql.Connection conn = ((EntityManagerImpl)(em.getDelegate())).getServerSession().getAccessor().getConnection(); 
+0

Fonctionne bien, merci! Y a-t-il des pièges/avantages inobservables qui rendraient cela meilleur que la solution de Balus? – BlairHippo

+0

Pour JPA 1.0, cette solution est moins verbeuse et cela a fonctionné pour moi. Mais ce n'est pas documenté. Si vous utilisez JPA 2.0, optez pour la solution wiki EclipseLink fournie par BalusC. –

+0

Ce n'est pas correct - EntityManager peut être enveloppé par l'implémentation du conteneur, donc vous ne pouvez pas le lancer de façon fiable. – dmatej