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();
您应该能够从org.eclipse.persistence.internal.jpa.EntityManagerImpl
由EntityManager.getDelegate()
返回得到它:
java.sql.Connection conn = ((EntityManagerImpl)(em.getDelegate())).getServerSession().getAccessor().getConnection();
很好地工作,谢谢!是否有任何明显的陷阱/好处,使这比Balus的解决方案更好? – BlairHippo 2010-01-14 22:29:44
对于JPA 1.0,此解决方案不太详细,它适用于我。但它没有记录。如果您使用的是JPA 2.0,请参阅由BalusC提供的EclipseLink wiki解决方案。 – 2010-01-14 22:55:07
这是不正确的 - EntityManager可能被容器的实现包装,所以你不能可靠地强制转换它。 – dmatej 2013-11-20 11:35:32
很好地工作,谢谢! (而且我想我在早期的Google Flailing中遇到过这个问题;不确定我是如何设法实现它的。)是否有任何明显的陷阱/好处让它比Pascal的解决方案更好? – BlairHippo 2010-01-14 22:27:18
您使用的是哪个JPA API版本?如果2.0,那么我肯定会去'EntityManager#unwrap()'。如果是1.0,那么我个人发现Pascal的解决方案更清晰/更好,但我不确定它是否会始终返回工作连接,因为您在Transaction/UnitOfWork之外。否则,它将被描述为在EclipseLink自己的Wiki中。 – BalusC 2010-01-14 22:34:10
我实际上使用的是1.0,但是如果有人怀疑Pascal可能并不总是有效,那么这是我必须遵循的一个。非常感谢您的帮助。 – BlairHippo 2010-01-15 14:13:16