Java JPA2.1-从Hibernate获取连接实例的可移植方法?

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)

我尝试使用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);
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
真的

这与所问问题无关。