session.connection () déconseillé sur Hibernate?

Nous devons être en mesure d’obtenir le java.sql.Connection associé d’une session d’hibernation. Aucune autre connexion ne fonctionnera, car cette connexion peut être associée à une transaction en cours.

Si session.connection () est maintenant obsolète, comment suis-je censé le faire?

Vous devez maintenant utiliser l’API de travail:

 session.doWork( new Work() { public void execute(Connection connection) throws SQLException { doSomething(connection); } } ); 

Ou, en Java 8:

 session.doWork(connection -> doSomething(connection)); 

Si session.connect() est maintenant obsolète, comment suis-je censé le faire?

Vous devez utiliser la Session#doWork(Work) et l’API de Work , comme mentionné dans le Javadoc:

connection()
Déconseillé. (prévu pour l’enlèvement dans 4.x). Le remplacement dépend des besoins; pour faire des trucs JDBC directs, utilisez doWork(org.hibernate.jdbc.Work) ; pour ouvrir une session ‘session temporaire’ (TBD).

Vous avez un peu de temps avant Hibernate 4.x, mais bon, l’utilisation d’une API obsolète ressemble à ceci:

texte alt 🙂

Mise à jour: Selon RE: [hibernate-dev] Connexion par proxy sur la liste hibernate-dev, il semble que l’intention initiale de la dépréciation était de décourager l’utilisation de Session#connection() car elle était / est considérée comme une “mauvaise “API, mais il était censé restr à ce moment-là. Je suppose qu’ils ont changé d’avis …

Il y a une autre option avec encore beaucoup de moulages, mais au moins, elle ne nécessite pas de reflection, ce qui vous permettra de vérifier le temps de compilation:

 public Connection getConnection(final EntityManager em) { HibernateEntityManager hem = (HibernateEntityManager) em; SessionImplementor sim = (SessionImplementor) hem.getSession(); return sim.connection(); } 

Vous pourriez bien sûr rendre cela encore plus “joli” avec quelques vérifications d’ instanceof , mais la version ci-dessus fonctionne pour moi.

Essaye ça

 ((SessionImpl)getSession()).connection() 

Actuly getSession renvoie le type d’interface de session, vous devriez voir quelle est la classe d’origine de la session, tapez cast pour la classe d’origine puis obtenez la connexion.

BONNE CHANCE!

Voici un moyen de le faire dans Hibernate 4.3, et il n’est pas obsolète:

  Session session = entityManager.unwrap(Session.class); SessionImplementor sessionImplementor = (SessionImplementor) session; Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection(); 

connection() était simplement obsolète sur l’interface. Il est toujours disponible sur SessionImpl . Vous pouvez faire ce que fait le spring et l’appeler simplement.

Voici le code de HibernateJpaDialect dans Spring 3.1.1

 public Connection getConnection() { try { if (connectionMethod == null) { // reflective lookup to bridge between Hibernate 3.x and 4.x connectionMethod = this.session.getClass().getMethod("connection"); } return (Connection) ReflectionUtils.invokeMethod(connectionMethod, this.session); } catch (NoSuchMethodException ex) { throw new IllegalStateException("Cannot find connection() method on Hibernate session", ex); } } 

C’est ce que j’utilise et travaille pour moi. Abaissez la méthode Session dans un SessionImpl et obtenez facilement l’object de connexion:

 SessionImpl sessionImpl = (SessionImpl) session; Connection conn = sessionImpl.connection(); 

session est le nom de votre object de session Hibernate.

J’ai trouvé cet article

 package com.varasofttech.client; import java.sql.Connection; import java.sql.SQLException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.SessionImpl; import org.hibernate.jdbc.ReturningWork; import org.hibernate.jdbc.Work; import com.varasofttech.util.HibernateUtil; public class Application { public static void main(Ssortingng[] args) { // Different ways to get the Connection object using Session SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.openSession(); // Way1 - using doWork method session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { // do your work using connection } }); // Way2 - using doReturningWork method Connection connection = session.doReturningWork(new ReturningWork() { @Override public Connection execute(Connection conn) throws SQLException { return conn; } }); // Way3 - using Session Impl SessionImpl sessionImpl = (SessionImpl) session; connection = sessionImpl.connection(); // do your work using connection // Way4 - using connection provider SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory(); ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider(); try { connection = connectionProvider.getConnection(); // do your work using connection } catch (SQLException e) { e.printStackTrace(); } } } 

Ça m’a aidé.

Avec Hibernate > = 5.0, vous pouvez obtenir la Connection comme ceci:

 Connection c = sessionFactory. getSessionFactoryOptions().getServiceRegistry(). getService(ConnectionProvider.class).getConnection(); 

Pour hibenate 4.3, essayez ceci:

 public static Connection getConnection() { EntityManager em = ; Session ses = (Session) em.getDelegate(); SessionFactoryImpl sessionFactory = (SessionFactoryImpl) ses.getSessionFactory(); try{ connection = sessionFactory.getConnectionProvider().getConnection(); }catch(SQLException e){ ErrorMsgDialog.getInstance().setException(e); } return connection; } 

Essaye ça:

 public Connection getJavaSqlConnectionFromHibernateSession() { Session session = this.getSession(); SessionFactoryImplementor sessionFactoryImplementor = null; ConnectionProvider connectionProvider = null; java.sql.Connection connection = null; try { sessionFactoryImplementor = (SessionFactoryImplementor) session.getSessionFactory(); connectionProvider = (ConnectionProvider) sessionFactoryImplementor.getConnectionProvider().getConnection(); connection = connectionProvider.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return connection; } 
  Connection conn = null; PreparedStatement preparedStatement = null; try { Session session = (org.hibernate.Session) em.getDelegate(); SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory(); ConnectionProvider cp = sfi.getConnectionProvider(); conn = cp.getConnection(); preparedStatement = conn.prepareStatement("Select id, name from Custumer"); ResultSet rs = preparedStatement.executeQuery(); while (rs.next()) { System.out.print(rs.getInt(1)); System.out.println(rs.getSsortingng(2)); } } catch (Exception e) { e.printStackTrace(); } finally { if (preparedStatement != null) { preparedStatement.close(); } if (conn != null) { conn.close(); } }