我有一个工作的应用程序,我使用Java EE 6和EclipseLink进行持久化和PostgreSQL数据库。
对于用户注册我想将PostgreSQL中的密码设置为:
... password = crypt('inputPassword',gen_salt('bf')) ...
由于我不能使用DigestUtils,我必须手动将用户插入数据库。
为了保持我的应用程序可配置,我不想用一个查询DataSource
InitialContextInstance.lookup(dataSource)
但要以某种方式从EntityManager中提取它(或连接)
像:
DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection();
或者是否可以使用createNativeQuery或类似的东西 准备好防止注射的声明?
答案 0 :(得分:16)
有时它只需要在谷歌中进行另一次运行:
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
中所述
答案 1 :(得分:5)
回应“阿基米德·特拉哈诺”对接受的答案的评论,接受的答案是否适用于除Eclipselink以外的其他人?对于至少Hibernate,答案是否定的。
当我尝试接受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
}
});
答案 2 :(得分:0)
以下是基于dulon的回答的Hibernate 4代码片段
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;
}
}