JPA和PostgreSQL

JPA和PostgreSQL

问题描述:

我正在使用JPA的EclipseLink实现与PostgreSQL数据库对话的项目。我有一个任务,PostgreSQL NOTIFY/LISTEN似乎是一个完美的选择。不幸的是,我是JPA newb,并且正在努力弄清楚如何使其工作。所以我想我真的有两个问题。回答任何一个都会让我开心。JPA和PostgreSQL

1)什么是最好的方式来获得直接的JDBC连接到数据库? (我真诚地希望将被证明是org.postgresql.PGConnection型的。)

OR

2)什么对我来说,通过EclipseLink的JPA模拟/接入org.postgresql.PGConnection.getNotifications()的最佳方式?

非常感谢您的帮助。


编辑:两个工作解决方案!我喜欢这个网站。如果有人有任何关于隐藏的疑难问题/好处的说法,那么在我交出对号之前,会让帕斯卡或巴勒斯的解决方案比其他人更好,我想听听它。

在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

您应该能够从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