2017-01-18 7 views
3

Я пытаюсь получить экземпляр java.sql.Connection с EntityManager.unwrap в JPA-переносном режиме с Hibernate 5.2.5.Final.JPA 2.1-переносимый способ получить экземпляр Connection из Hibernate?

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

, который не выполнен из-за Exception in thread "main" javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connection. Он отлично работает в Eclipselink 2.6.4.

Я знаю о возможности (unportable) развернуть Hibernate Session и получить от него Connection, но я хотел бы знать, есть ли переносная дорога.

Там в Get hold of a JDBC Connection object from a Stateless Bean, но не указывается явно, что Hibernate не поддерживает это по спецификации или из-за ошибки, и это с 2011 года

ответ

1

Поскольку вы упомянули JPA я предполагаю, что вы используете j2ee.

Сначала увидеть, если это помогает: How can i get the session object if i have the entitymanager

Если это не поможет, я могу объяснить, как я получаю связь с Wildfly 9 и 8. Вы должны иметь источник данных PostgreSQL определен вам ваш standalone.xml. Тогда вы можете получить доступ с помощью следующего кода 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 
    } 

} 

Пример XML-фрагмент нашего PostGreSQL источника данных ниже. Просто установите переменные окружения для того, что вам нужно:

 <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> 
Смежные вопросы