12

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

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

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

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

DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection();

或者是否可以将 createNativeQuery 或类似的东西与准备好的语句结合使用来防止注入?

4

3 回答 3

16

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

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

Eclipse 链接文档中所述

于 2013-06-07T23:23:54.610 回答
5

响应“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 的解决方案。

从无状态 Bean 中获取 JDBC 连接对象

Hibernate 获取 JasperRunManager 的 Connection 对象

这是我的解决方案:

    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
        }
    });
于 2014-11-20T16:52:25.570 回答
0

这是一段与 Hibernate 4 一起使用的代码,基于 dulon 的回答

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;
    }

}
于 2016-01-27T19:33:32.653 回答