JPA and PostgreSQL

5
我正在参与一个使用EclipseLink实现JPA与PostgreSQL数据库通信的项目。我有一个任务,其中PostgreSQL NOTIFY/LISTEN似乎非常合适。不幸的是,我是一个JPA新手,正在努力弄清楚如何使其工作。所以我有两个问题;回答任何一个都会让我很高兴。
1)获取直接JDBC连接到数据库的最佳方式是什么?(我真诚地希望它将被证明是类型为org.postgresql.PGConnection。)
或者
2)通过EclipseLink JPA模拟/访问org.postgresql.PGConnection.getNotifications()的最佳方法是什么?
非常感谢您的帮助。
编辑: 两个可行的解决方案!我喜欢这个网站。如果在我分配检查标记之前,任何人对Pascal或Balus的解决方案有任何隐藏的陷阱/优点要说的话,我想听听。
2个回答

8
从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();

工作得很好,谢谢!(我想我在早期的谷歌搜索中遇到过这个问题;不确定我如何没有实现它。)是否有任何不明显的陷阱/优点,使其比Pascal的解决方案更好? - BlairHippo
你使用的是哪个JPA API版本?如果是2.0,那么我肯定会选择EntityManager#unwrap()。如果是1.0,那么我个人认为Pascal的解决方案更清晰/更好,但我不确定它是否总是会返回一个可用的连接,因为你在事务/工作单元之外。否则,它将如EclipseLink自己的Wiki中所述。 - BalusC
我实际上正在使用1.0版本,但如果有任何怀疑帕斯卡可能不总是有效的话,我就必须使用这个版本。非常感谢您的帮助。 - BlairHippo

2

您应该能够从EntityManager.getDelegate()返回的org.eclipse.persistence.internal.jpa.EntityManagerImpl中获取它:

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

做得很好,谢谢!有没有什么不明显的坑点/优点可以使它比Balus的解决方案更好? - BlairHippo
对于JPA 1.0,这个解决方案不太啰嗦,而且对我很有效。但是它没有文档记录。如果你正在使用JPA 2.0,请选择BalusC提供的EclipseLink wiki解决方案。 - Pascal Thivent
不正确的做法 - EntityManager 可能被容器的实现所包装,因此您不能可靠地进行转换。 - dmatej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接