JPA и PostgreSQL - PullRequest
       19

JPA и PostgreSQL

5 голосов
/ 15 января 2010

Я нахожусь в проекте, который использует реализацию JPA EclipseLink для связи с базой данных PostgreSQL. У меня есть задача, для которой PostgreSQL NOTIFY / LISTEN кажется идеально подходящим. К сожалению, я новичок в JPA и изо всех сил пытаюсь понять, как заставить это работать. Так что, думаю, у меня действительно есть два вопроса; ответ на любой из них сделает меня счастливым.

1) Какой лучший способ для меня получить прямое соединение JDBC с базой данных? (Который, я искренне надеюсь, окажется типа org.postgresql.PGConnection.)

OR

2) Как мне лучше всего эмулировать / получить доступ к org.postgresql.PGConnection.getNotifications() через EclipseLink JPA?

Большое спасибо за вашу помощь.


Редактировать: Два рабочих решения! Я люблю этот сайт. Если кто-нибудь что-нибудь скажет о скрытых ошибках / преимуществах, которые сделают решение Паскаля или Балуса лучше, чем другое, прежде чем я раздам ​​галочку, я бы хотел услышать это.

Ответы [ 2 ]

8 голосов
/ 15 января 2010

Ответ о получении соединения JDBC от EntityManager в EclipseLink содержится в EclipseLink wiki .

Способ зависит от версии API JPA. Вот выдержка из вики:

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();
2 голосов
/ 15 января 2010

Вы должны быть в состоянии получить его от org.eclipse.persistence.internal.jpa.EntityManagerImpl, который возвращается EntityManager.getDelegate():

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