【问题标题】:JPA and PostgreSQLJPA 和 PostgreSQL
【发布时间】:2011-01-05 06:48:21
【问题描述】:

我正在进行一个使用 JPA 的 EclipseLink 实现与 PostgreSQL 数据库通信的项目。我有一个任务,PostgreSQL NOTIFY/LISTEN 似乎非常适合。不幸的是,我是一个 JPA 新手,并且正在努力弄清楚如何使它工作。所以我想我真的有两个问题;回答任何一个都会让我开心。

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

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

非常感谢您的帮助。


编辑: 两个可行的解决方案!我喜欢这个网站。如果在我发出复选标记之前,有人对隐藏的陷阱/好处有什么要说的,这将使 Pascal 或 Balus 的解决方案比另一个更好,我想听听。

【问题讨论】:

    标签: java postgresql jpa eclipselink


    【解决方案1】:

    在 EclipseLink 中从 EntityManager 获取 JDBC 连接在 EclipseLink wiki 中得到解答。

    方式因 JPA API 版本而异。以下是 wiki 的摘录:

    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 的解决方案更好?
    • 您使用的是哪个 JPA API 版本?如果是 2.0,那么我肯定会选择 EntityManager#unwrap()。如果是 1.0,那么我个人认为 Pascal 的解决方案更清晰/更好,但我不确定它是否会始终返回工作连接,因为您当时不在 Transaction/UnitOfWork 之外。否则它将在 EclipseLink 自己的 Wiki 中描述。
    • 我实际上使用的是 1.0,但如果怀疑 Pascal 可能并不总是有效,那么我必须使用这个。非常感谢您的帮助。
    【解决方案2】:

    您应该可以从org.eclipse.persistence.internal.jpa.EntityManagerImpl 获得它,它由EntityManager.getDelegate() 返回:

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

    【讨论】:

    • 效果很好,谢谢!是否有任何不明显的陷阱/好处可以使它比 Balus 的解决方案更好?
    • 对于 JPA 1.0,这个解决方案不那么冗长,它对我有用。但它没有记录。如果您使用的是 JPA 2.0,请使用 BalusC 提供的 EclipseLink wiki 解决方案。
    • 这是不正确的 - EntityManager 可能被容器的实现包装,所以你不能可靠地转换它。
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2011-02-18
    • 2012-11-08
    • 2016-10-12
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多