2010-01-14 81 views
4

我正在使用JPA的EclipseLink實現與PostgreSQL數據庫對話的項目。我有一個任務,PostgreSQL NOTIFY/LISTEN似乎是一個完美的選擇。不幸的是,我是JPA newb,並且正在努力弄清楚如何使其工作。所以我想我真的有兩個問題。回答任何一個都會讓我開心。JPA和PostgreSQL

1)什麼是最好的方式來獲得直接的JDBC連接到數據庫? (我真誠地希望將被證明是org.postgresql.PGConnection型的。)

OR

2)什麼對我來說,通過EclipseLink的JPA模擬/接入org.postgresql.PGConnection.getNotifications()的最佳方式?

非常感謝您的幫助。


編輯:兩個工作解決方案!我喜歡這個網站。如果有人有任何關於隱藏的疑難問題/好處的說法,那麼在我交出對號之前,會讓帕斯卡或巴勒斯的解決方案比其他人更好,我想聽聽它。

回答

7

在EclipseLink中從EntityManager獲取JDBC連接的方法在EclipseLink wiki中得到解答。

每種JPA API版本的方式不同。下面是來自維基摘錄:

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 Flailing中遇到過這個問題;不確定我是如何設法實現它的。)是否有任何明顯的陷阱/好處讓它比Pascal的解決方案更好? – BlairHippo 2010-01-14 22:27:18

+0

您使用的是哪個JPA API版本?如果2.0,那麼我肯定會去'EntityManager#unwrap()'。如果是1.0,那麼我個人發現Pascal的解決方案更清晰/更好,但我不確定它是否會始終返回工作連接,因爲您在Transaction/UnitOfWork之外。否則,它將被描述爲在EclipseLink自己的Wiki中。 – BalusC 2010-01-14 22:34:10

+0

我實際上使用的是1.0,但是如果有人懷疑Pascal可能並不總是有效,那麼這是我必須遵循的一個。非常感謝您的幫助。 – BlairHippo 2010-01-15 14:13:16

2

您應該能夠從org.eclipse.persistence.internal.jpa.EntityManagerImplEntityManager.getDelegate()返回得到它:

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

很好地工作,謝謝!是否有任何明顯的陷阱/好處,使這比Balus的解決方案更好? – BlairHippo 2010-01-14 22:29:44

+0

對於JPA 1.0,此解決方案不太詳細,它適用於我。但它沒有記錄。如果您使用的是JPA 2.0,請參閱由BalusC提供的EclipseLink wiki解決方案。 – 2010-01-14 22:55:07

+0

這是不正確的 - EntityManager可能被容器的實現包裝,所以你不能可靠地強制轉換它。 – dmatej 2013-11-20 11:35:32