2017-01-18 27 views
3

EntityManager.unwrapjava.sql.Connectionインスタンスを、JPAポータブルな方法でHibernate 5.2.5.Finalで取得しようとしました。JPA 2.1ポータブルな方法でHibernateから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(); 
    } 
} 

Exception in thread "main" javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connectionのために失敗しました。 Eclipselink 2.6.4では正常に動作します。

私はHibernate 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

それは私が、私はあなたがあなたのstandalone.xmlを定義したPostgreSQLのデータソースを持っている必要がありWildfly 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>