Search code examples
javapostgresqljpaeclipselink

JPA and PostgreSQL


I'm on a project that uses the EclipseLink implementation of JPA to talk to a PostgreSQL database. I have a task for which PostgreSQL NOTIFY/LISTEN seems like a perfect fit. Unfortunately, I'm a JPA newb, and am struggling to figure out how to make it work. So I guess I really have two questions; answering either one will make me happy.

1) What's the best way for me to get a hold of the direct JDBC connection to the database? (Which I sincerely hope will prove to be of type org.postgresql.PGConnection.)

OR

2) What's the best way for me to emulate/access org.postgresql.PGConnection.getNotifications() via EclipseLink JPA?

Thank you very much for your help.


Edit: Two working solutions! I love this site. If anybody has anything to say about hidden gotchas/benefits that would make either Pascal's or Balus's solution better than the other before I hand out the checkmark, I'd like to hear it.


Solution

  • Getting a JDBC connection from an EntityManager in EclipseLink is answered in the EclipseLink wiki.

    The way differs per JPA API version. Here's an extract from the 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();