web-dev-qa-db-fra.com

session.connection () obsolète sur Hibernate?

Nous devons pouvoir obtenir les Java.sql.Connection d'une session d'hibernation. Aucune autre connexion ne fonctionnera, cette connexion pouvant être associée à une transaction en cours d'exécution.

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

74
TraderJoeChicago

Vous devez maintenant utiliser l'API de travail:

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

Ou, dans Java 8+:

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

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

Vous devez utiliser Session#doWork(Work) et l'API Work , comme indiqué dans la Javadoc:

connection()
Obsolète. (suppression prévue dans 4.x). Le remplacement dépend du besoin. pour utiliser directement des éléments JDBC, utilisez doWork(org.hibernate.jdbc.Work) ; pour ouvrir une utilisation de "session temporaire" (à déterminer).

Vous avez un peu de temps avant Hibernate 4.x mais, eh bien, utiliser une API dépréciée ressemble à ceci:

alt text:)

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 soit de décourager l’utilisation de Session#connection() car elle était/est considérée comme une "mauvaise" API, mais était censé rester à ce moment-là. Je suppose qu'ils ont changé d'avis ...

23
Pascal Thivent

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, transtyper le type dans la classe d'origine, puis obtenir la connexion.

BONNE CHANCE!

11

C'est ce que j'utilise et travaille pour moi. Décalez la méthode Session dans un SessionImpl et récupérez facilement l'objet de connexion:

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

session est le nom de votre objet de session Hibernate.

9
Simon Mbatia

Voici une façon de le faire dans Hibernate 4.3, et ce n’est pas obsolète:

  Session session = entityManager.unwrap(Session.class);
  SessionImplementor sessionImplementor = (SessionImplementor) session;
  Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();
9
Louis-Félix

Il y a une autre option qui implique encore beaucoup d'incantations, mais au moins cela n'a pas besoin de réflexion, ce qui vous donnera la vérification du 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 instanceof vérifications, mais la version ci-dessus fonctionne pour moi.

9
Stefan Haberl

connection() était simplement obsolète sur l'interface. Il est toujours disponible sur SessionImpl. Vous pouvez faire ce que Spring fait et appeler celui-là.

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);
        }
    }
8
Patrick

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(String[] 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<Connection>() {
        @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é.

6
user1490538

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

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

Pour Hibernate 4.3, essayez ceci:

public static Connection getConnection() {
        EntityManager em = <code to create 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;
    }
3
shcherbak

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;
}
1
segaurav
    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.getString(2));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
0
user2209871