2010-01-14 2 views
4

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

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

ИЛИ

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

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


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

ответ

7

Получение соединения 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(); 
+0

Работает хорошо, спасибо! (И я думаю, что натолкнулся на это во время раннего разворота Google, не уверен, как мне удалось не реализовать его.) Есть ли какие-либо неочевидные выгоды/преимущества, которые сделают это лучше, чем решение Паскаля? – BlairHippo

+0

Какую версию JPA API вы используете? Если 2.0, то я определенно буду искать 'EntityManager # unwrap()'. Если 1.0, то я лично считаю решение Pascal более ясным/приятным, но я не уверен, что он всегда будет возвращать рабочее соединение, так как вы находитесь за пределами транзакции/UnitOfWork. В противном случае это будет описано как в собственной вики EclipseLink. – BalusC

+0

Я на самом деле использую 1.0, но если есть подозрения, что Паскаль может не всегда работать, это тот, с которым мне нужно идти. Большое спасибо за Вашу помощь. – BlairHippo

2

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

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

Работает хорошо, спасибо! Есть ли какие-либо непредвиденные выгоды/выгоды, которые сделают это лучше, чем решение Balus? – BlairHippo

+0

Для JPA 1.0 это решение менее подробное, и оно сработало для меня. Но это не задокументировано. Если вы используете JPA 2.0, перейдите к решению Wiki от EclipseLink, предоставленному BalusC. –

+0

Неправильно - EntityManager может быть обернут реализацией контейнера, поэтому вы не можете надежно его наложить. – dmatej

Смежные вопросы