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?
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));
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, utilisezdoWork(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:
:)
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 ...
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!
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();
où session
est le nom de votre objet de session Hibernate.
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();
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.
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);
}
}
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é.
Avec Hibernate
> = 5.0, vous pouvez obtenir le Connection
comme ceci:
Connection c = sessionFactory.
getSessionFactoryOptions().getServiceRegistry().
getService(ConnectionProvider.class).getConnection();
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;
}
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.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (conn != null) {
conn.close();
}
}