Java JPA与PostgreSQL

Java JPA与PostgreSQL,java,postgresql,jpa,eclipselink,Java,Postgresql,Jpa,Eclipselink,我参与的一个项目使用JPA的EclipseLink实现与PostgreSQL数据库进行对话。我有一个任务,PostgreSQL NOTIFY/LISTEN似乎非常适合它。不幸的是,我是一个JPA新手,正在努力想办法让它工作。所以我想我真的有两个问题;回答任何一个问题都会让我高兴 1) 对于我来说,获得到数据库的直接JDBC连接的最佳方法是什么?(我真诚地希望它是org.postgresql.PGConnection类型) 或 2) 通过EclipseLink JPA模拟/访问org.postgr

我参与的一个项目使用JPA的EclipseLink实现与PostgreSQL数据库进行对话。我有一个任务,PostgreSQL NOTIFY/LISTEN似乎非常适合它。不幸的是,我是一个JPA新手,正在努力想办法让它工作。所以我想我真的有两个问题;回答任何一个问题都会让我高兴

1) 对于我来说,获得到数据库的直接JDBC连接的最佳方法是什么?(我真诚地希望它是
org.postgresql.PGConnection
类型)

2) 通过EclipseLink JPA模拟/访问org.postgresql.PGConnection.getNotifications()的最佳方式是什么

非常感谢你的帮助。

编辑:两个有效的解决方案!我喜欢这个网站。如果有人想在我给出复选标记之前,对Pascal或Balus的解决方案比其他解决方案更好的隐藏陷阱/好处说些什么,我很乐意听听。

从EclipseLink中的
EntityManager
获取JDBC连接在

每个JPAAPI版本的方式都不同。以下是维基的摘录:

JPA2.0

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
UnitOfWorkImpl unitOfWork = (UnitOfWorkImpl)((JpaEntityManager)entityManager.getDelegate()).getActiveSession();
unitOfWork.beginEarlyTransaction();
java.sql.Connection connection = unitOfWork.getAccessor().getConnection();
...
entityManager.getTransaction().commit();
JPA1.0

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
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()返回:


很好用,谢谢!(我想我在早期的谷歌游戏中遇到了这个问题;我不知道我是如何做到不去实现它的。)有没有什么不寻常的陷阱/好处可以让它比Pascal的解决方案更好?你使用的是哪个JPA API版本?如果是2.0,那么我肯定会选择
EntityManager#unwrap()
。如果是1.0,那么我个人觉得Pascal的解决方案更清晰/更好,但我不确定它是否会始终返回一个工作连接,因为此时您在事务/工作单元之外。否则它会被描述为EclipseLink自己的Wiki。我实际上使用的是1.0,但如果有人怀疑Pascal的可能并不总是有效的,这就是我必须使用的。非常感谢您的帮助。效果很好,谢谢!是否有任何不寻常的问题/好处可以让它比Balus的解决方案更好?对于JPA1.0,这个解决方案没有那么冗长,而且对我来说很有效。但它没有被记录在案。如果您使用的是JPA2.0,请使用BalusC提供的EclipseLink wiki解决方案。这是不正确的-EntityManager可能由容器的实现包装,因此您无法可靠地强制转换它。