2016-12-16 12 views
2

Я пытаюсь получить объект Connection в спящем режиме, когда используется SessionFactory.getCurrentSession().Получить объект Connection при использовании SessionFactory.getCurrentSession() в Hibernate

Исходный код

import java.sql.Connection; 
import java.sql.DatabaseMetaData; 
import java.sql.SQLException; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.internal.SessionImpl; 

public class SOExample { 
    public static void main(String[] args) throws SQLException { 
     Configuration configuration = new Configuration(); 
     SessionFactory sessionFactory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build()); 
     Session session = sessionFactory.getCurrentSession(); 
     Connection connection = ((SessionImpl) session).connection(); 
     // doing operation on connection object as per my requirement 
     DatabaseMetaData databaseMetaData = connection.getMetaData(); 
     System.out.println(databaseMetaData.getDatabaseProductName()); 
    } 
} 

StackTrace

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy24 cannot be cast to org.hibernate.internal.SessionImpl 
    at com.SOExample.main(SOExample.java:20) 

getCurrentSession() дает Proxy объект Session так Он не может бросить его SessionImpl так, что есть другие способы, чтобы получить Connection объект , Или Как SessionImpl от объекта прокси.


Другой вариант я пробовал, но это говорит getConnectionProvider() метод не найден.

SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory(); 
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider(); 
try { 
    Connection connection = connectionProvider.getConnection(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 

Примечание: Я использую гибернации-ядро-5.0.5.Final.jar

ответ

7

В Hibenate 5 мы должны сделать вещи немного другой (для получения более подробной информации проверить https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html):

import java.sql.Connection; 
import java.sql.SQLException; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.boot.registry.StandardServiceRegistry; 
import org.hibernate.boot.MetadataSources; 
import org.hibernate.boot.Metadata; 
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; 
import org.hibernate.jdbc.Work; 


public class Htest { 

    public static void main(String ... args) throws SQLException { 
     StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() 
       .configure("hibernate.cfg.xml") 
       .build(); 

     Metadata metadata = new MetadataSources(standardRegistry) 
       .addAnnotatedClass(TesEntity.class) 
       .buildMetadata(); 

     SessionFactory sessionFactory = metadata.getSessionFactoryBuilder() 
       .build(); 

     //one way to get connection version 5.0.2 
     Connection c = sessionFactory. 
       getSessionFactoryOptions().getServiceRegistry(). 
       getService(ConnectionProvider.class).getConnection(); 

     Session sess = null; 
     try { 
      sess = sessionFactory.getCurrentSession(); 
     } catch (org.hibernate.HibernateException he) { 
      sess = sessionFactory.openSession(); 
     } 


     //If you are using latest version 5.2.3 you can use this line below 
     //Connection c = ((SessionImpl)sess.getSession()).connection(); 
     System.out.println(c.getMetaData().getDatabaseProductName()); 

     //another way to get connection 
     sess.doWork(new Work() { 
      @Override 
      public void execute(Connection connection) throws SQLException { 
       //connection accessible here 
       System.out.println(connection.getMetaData().getDatabaseProductName()); 
      } 
     }); 
    } 
} 

Моя конфигурация в дерби дб, если вы тусклый, чтобы проверить код.

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> 
     <property name="hibernate.connection.url">jdbc:derby://localhost:1527/mytest;create=fasle</property> 
     <!-- <property name="connection.username"/> --> 
     <!-- <property name="connection.password"/> --> 

     <!-- DB schema will be updated if needed --> 
     <!-- <property name="hbm2ddl.auto">update</property> --> 
    </session-factory> 
</hibernate-configuration> 

Выход этого приложения:

enter image description here

+0

Есть ли другой способ? Я хочу это отдельно, потому что я передаю этот объект в другом классе и методах. –

+0

У меня есть обновленный код. Пожалуйста, проверьте, может быть, это решение будет приемлемым для вас. –

+0

Нет никакого метода 'session.getSession()' –

 Смежные вопросы

  • Нет связанных вопросов^_^