2017-01-18 2 views
3

EntityManager.unwrap으로 java.sql.Connection 인스턴스를 얻으려고하면 Hibernate 5.2.5.Final을 사용하여 JPA로 이식 할 수 있습니다. Exception in thread "main" javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connection로 인해 실패Hibernate로부터 Connection 인스턴스를 가져 오는 JPA 2.1- 포터블 방법?

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

. 그것은 Eclipselink 2.6.4에서 잘 작동합니다.

최대 절전 모드 Session을 풀어서 Connection을 얻을 수있는 가능성에 대해 알고 있지만, 휴대용 방법이 있는지 알고 싶습니다.

Get hold of a JDBC Connection object from a Stateless Bean하지만 그것은 Hibernate가 사양이나 버그로 인해이 기능을 지원하지 않음을 명시 적으로 언급하지 않으며, 당신은 당신이 J2EE를 사용한다고 가정 JPA를 언급 한 이후로는 2011 년

답변

1

에서입니다.

이 도움이된다면 먼저 참조 : How can i get the session object if i have the entitymanager

을 그 나는 당신은 PostgreSQL의 데이터 소스가 당신에게 당신의 standalone.xml를 정의해야 제이보스 9 8.와의 연결을 얻는 방법을 설명 할 수 있습니다 도움이되지 않는 경우. 그런 다음 다음 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>