Java JPA2.1-从Hibernate获取连接实例的可移植方法?
我尝试使用Hibernate 5.2.5.Final以JPA可移植的方式使用Java JPA2.1-从Hibernate获取连接实例的可移植方法?,java,hibernate,jpa,jpa-2.1,Java,Hibernate,Jpa,Jpa 2.1,我尝试使用Hibernate 5.2.5.Final以JPA可移植的方式使用EntityManager.unwrap获取java.sql.Connection实例 Class<?> databaseDriver = EmbeddedDriver.class; File databaseDir = File.createTempFile(NewClass.class.getSimpleName(), null); FileUtils.deleteQuietly(databaseDir)
EntityManager.unwrap
获取java.sql.Connection
实例
Class<?> databaseDriver = EmbeddedDriver.class;
File databaseDir = File.createTempFile(NewClass.class.getSimpleName(), null);
FileUtils.deleteQuietly(databaseDir);
LOGGER.info(String.format("using '%s' as database directory", databaseDir.getAbsolutePath()));
String databaseURL = String.format("jdbc:derby:%s", databaseDir.getAbsolutePath());
Connection connection = DriverManager.getConnection(String.format("%s;create=true", databaseURL));
connection.close();
EntityManagerFactory entityManagerFactory = null;
EntityManager entityManager = null;
try {
Map<Object, Object> properties = new HashMap<>();
properties.put("javax.persistence.jdbc.url", databaseURL);
properties.put("javax.persistence.jdbc.driver", databaseDriver.getName());
entityManagerFactory = Persistence.createEntityManagerFactory("richtercloud_hibernate-missing-escape-chars_jar_1.0-beta2PU",
properties);
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
connection = entityManager.unwrap(java.sql.Connection.class);
//do something with connection...
}finally {
if(entityManager != null) {
entityManager.close();
}
if(entityManagerFactory != null) {
entityManagerFactory.close();
}
}
Class databaseDriver=EmbeddedDriver.Class;
File databaseDir=File.createTempFile(NewClass.class.getSimpleName(),null);
FileUtils.deleteDir(databaseDir);
LOGGER.info(String.format(“使用'%s'作为数据库目录”,databaseDir.getAbsolutePath());
String databaseURL=String.format(“jdbc:derby:%s”,databaseDir.getAbsolutePath());
连接Connection=DriverManager.getConnection(String.format(“%s;create=true”,databaseURL));
connection.close();
EntityManagerFactory EntityManagerFactory=null;
EntityManager EntityManager=null;
试一试{
映射属性=新的HashMap();
properties.put(“javax.persistence.jdbc.url”,databaseURL);
properties.put(“javax.persistence.jdbc.driver”,databaseDriver.getName());
entityManagerFactory=Persistence.createEntityManagerFactory(“richtercloud\u hibernate-missing-escape-chars\u jar\u 1.0-beta2PU”,
财产);
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
connection=entityManager.unwrap(java.sql.connection.class);
//做些与连接有关的事情。。。
}最后{
如果(entityManager!=null){
entityManager.close();
}
if(entityManagerFactory!=null){
entityManagerFactory.close();
}
}
由于线程“main”javax.persistence.PersistenceException中的异常而失败:Hibernate无法打开接口java.sql.Connection
。它在Eclipselink 2.6.4中运行良好
我知道(不可移植的)打开Hibernate会话
并从中获得连接的可能性,但我想知道是否有可移植的方法
有,但它没有明确说明Hibernate不支持这个规范,或者由于一个bug,它是从2011年开始的。既然您提到了JPA,我假设您使用的是j2ee
首先看看这是否有帮助:
如果这没有帮助,我可以解释我是如何与Wildfly 9和8建立联系的。您应该在standalone.xml中定义postgresql数据源。然后,您可以通过以下java代码访问:
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.*;
import javax.sql.DataSource;
public class ConnectionFactory {
/**
* 'getConnection' method returns the JDBC connection from the DataSource.
*
* @return a value of type 'Connection'
* @exception SQLException if an error occurs
*/
public static Connection getConnection() throws SQLException{
return getDBConnection().getConnection();
}
public static DataSource getDBConnection() throws SQLException{
return getDataSource("java:jboss/datasources/PostgreSQLDS"); // jndi
}
}
下面是postgresql数据源的一个示例xml片段。只需将环境变量设置为所需:
<datasource jta="true" jndi-name="java:jboss/datasources/PostgreSQLDS" pool-name="PostgreSQLDS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:postgresql://${env.OPENSHIFT_POSTGRESQL_DB_HOST}:${env.OPENSHIFT_POSTGRESQL_DB_PORT}/${env.OPENSHIFT_APP_NAME}</connection-url>
<driver>postgresql</driver>
<new-connection-sql>select 1</new-connection-sql>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>50</max-pool-size>
<!--idle-timeout-minutes>1</idle-timeout-minutes> Default is 15 mins -->
<prefill>true</prefill>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
<security>
<user-name>${env.OPENSHIFT_POSTGRESQL_DB_USERNAME}</user-name>
<password>${env.OPENSHIFT_POSTGRESQL_DB_PASSWORD}</password>
</security>
<validation>
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
<background-validation>true</background-validation>
<validate-on-match>true</validate-on-match>
</validation>
<statement>
<track-statements>true</track-statements> <!-- Warn when statements and result sets not closed -->
<prepared-statement-cache-size>100</prepared-statement-cache-size>
<share-prepared-statements>true</share-prepared-statements>
</statement>
</datasource>
jdbc:postgresql://${env.OPENSHIFT\u postgresql\u DB\u HOST}:${env.OPENSHIFT\u postgresql\u DB\u PORT}/${env.OPENSHIFT\u APP\u NAME}
postgresql
选择1
10
50
真的
空闲连接
${env.OPENSHIFT\u POSTGRESQL\u DB\u USERNAME}
${env.OPENSHIFT\u POSTGRESQL\u DB\u PASSWORD}
选择1
真的
真的
真的
100
真的
这与所问问题无关。