【问题标题】:How to get DataSource or Connection from JPA2 EntityManager in Java EE 6如何在 Java EE 6 中从 JPA2 EntityManager 获取数据源或连接
【发布时间】:2013-06-07 23:10:55
【问题描述】:

我有一个工作应用程序,我使用 Java EE 6 和 EclipseLink 来实现持久性和一个 PostgreSQL 数据库。

对于用户注册,我想将 PostgreSQL 中的密码设置为:

... password = crypt('inputPassword',gen_salt('bf')) ...

由于我不能为此使用 DigestUtils,我必须手动将用户插入数据库。 为了使我的应用程序可配置,我不想使用 InitialContextInstance.lookup(dataSource) 但要以某种方式从 EntityManager 中提取它(或连接) 喜欢:

DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection();

或者是否可以结合使用 createNativeQuery 或类似的东西 有准备好的声明来防止注射?

【问题讨论】:

  • 如果您使用数据源进行 JPA 配置,您应该能够使用 @Resource(name="myDb") DataSource myDB 访问它。不是吗?而且我认为您也可以使用 JPA 定义参数化查询。
  • 是的,这可能有效,但我仍然需要知道名称。我想为注入的 EntityManager 获取配置的默认数据源。

标签: java jpa jdbc java-ee-6


【解决方案1】:

有时它只需要在 google 中再次运行:

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();

Eclipse Link Documentation中所述

【讨论】:

  • 是标准的一部分。它似乎特定于 Eclipselink
  • 有没有办法从此连接获取密码
  • 在 JPA + JTA (Java SDK 8u31) + WebSphere 8.5.5 上工作的好答案
【解决方案2】:

作为对已接受答案的“Archimedes Trajano”评论的回应,接受的答案是否适用于 Eclipselink 以外的其他答案?至少 Hibernate 的答案是否定的。

当我尝试接受的休眠答案时出现以下错误:

Caused by: org.springframework.orm.jpa.JpaSystemException: Hibernate cannot unwrap interface java.sql.Connection; nested exception is javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connection
     at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:418) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE]

结合以下 stackoverflow 问题的答案,我想出了一个适用于 Hibernate 的解决方案。

Get hold of a JDBC Connection object from a Stateless Bean

Hibernate get Connection object for JasperRunManager

这是我的解决方案:

    Session hibernateSession = entityManager.unwrap(Session.class);

    hibernateSession.doWork(new org.hibernate.jdbc.Work() {

        @Override
        public void execute(Connection connection) throws SQLException {
            // do whatever you need to do with the connection
        }
    });

【讨论】:

    【解决方案3】:

    根据 dulon 的回答,这是一个适用于 Hibernate 4 的 sn-p 代码

    Connection getConnection() {
            Session session = entityManager.unwrap(Session.class);
            MyWork myWork = new MyWork();
            session.doWork(myWork);
            return myWork.getConnection();
    }
    
    
    private static class MyWork implements Work {
    
        Connection conn;
    
        @Override
        public void execute(Connection arg0) throws SQLException {
            this.conn = arg0;
        }
    
        Connection getConnection() {
            return conn;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2016-06-09
      • 2012-04-29
      • 2019-06-22
      • 2012-01-05
      相关资源
      最近更新 更多