83 votes

session.connexion() obsolète sur Hibernate?

Nous devons être en mesure d'obtenir la java.sql.Connection d'une session hibernate. Aucune autre connexion fonctionnera, que cette connexion peut être associée à une transaction.

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

91voto

Keats Points 8938

Vous disposez maintenant d'utiliser le Travail de l'API:

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

Ou, dans Java 8 :

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

22voto

Pascal Thivent Points 295221

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

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

connection()
     Déconseillé. (prévu pour la suppression de 4.x). Remplacement dépend des besoins; pour cela direct JDBC trucs utiliser doWork(org.hibernate.jdbc.Work); pour l'ouverture d'une "Session temporaire' utilisation (à DÉTERMINER).

Vous avez un peu de temps avant Hibernate 4.x mais bon, à l'aide d'une API obsolètes en quelque sorte de ressemble à ça:

alt text:)

Mise à jour: Selon RE: [hibernate-dev] Connexion proxy sur la mise en veille prolongée-dev liste, il semble que l'intention initiale de l'abandon était de décourager l'utilisation de l' Session#connection() parce qu'il a été/est considéré comme un "mauvais" de l'API, mais il était censé rester à l'époque. Je suppose qu'ils ont changé leur esprit...

12voto

Essayez Ceci

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

Actuly getSession retourne Session type d'Interface, vous devriez voir ce qui est à l'origine de classe de la session, le type de fonte de la classe d'origine, puis obtenir la connexion.

BONNE CHANCE!

9voto

Stefan Haberl Points 764

Il y a une autre option, avec encore beaucoup de distributions concernées, mais au moins il n'a pas besoin de réflexion, qui va vous redonner le moment de la compilation, la vérification:

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

Vous pouvez bien sûr faire que même les "plus joli" avec un peu d' instanceof des contrôles, mais la version ci-dessus fonctionne pour moi.

8voto

Patrick Points 1664

connection() était juste obsolète sur l'interface. Il est toujours disponible sur SessionImpl. Vous pouvez faire ce que le Printemps ne et il suffit d'appeler celui-là.

Voici le code à partir d' HibernateJpaDialect au Printemps 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);
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X