如何从hibernate会话获取jdbc连接?

M S*_*ach 41 java hibernate jdbc

我想从hibernate session获得jdbc连接.在hibernate session中有一个方法,即session.connection(); 但它已被弃用.我知道这仍然有效,但我不想使用弃用的方法,因为我相信他们必须为此提供一些替代方案?在http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html连接方法api说使用org.hibernate.jdbc.Work为此目的,但我没有找到任何示例?

Tom*_*icz 85

以下是如何使用它:

session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        //connection, finally!
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 另外值得一提的是,如果要返回结果,还有doReturningWork(...)方法. (5认同)
  • @OscarRyz:如果你使用Spring,`@Transactional`或`TransactionTemplate`就足够了.在原始的Hibernate中,你必须[手动运行`session.beginTransaction()`(http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics). (2认同)
  • @Logicalj:你能提供一些参考吗?它[仍然在4.1中有效](http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#doWork(org.hibernate.jdbc.Work))... (2认同)

小智 23

试试这个:

((SessionImpl)getSession()).connection()
Run Code Online (Sandbox Code Playgroud)

  • 对于任何未经警告的人(就像我一样):[`Session.connection`](http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#connection%28 %29)方法目前已弃用. (8认同)
  • 从来没有投过Impl!它的内部!(org.hibernate.internal.SessionImpl).而且你不能再用模拟测试这段代码了.这很糟糕,原因很多. (4认同)

小智 11

我有一个类似的问题,我用这个ConnectionProvider类来获得连接.看我的解决方案:

Session session = entityManager.unwrap(Session.class);
SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory();
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider();
try {
       connection = connectionProvider.getConnection();
       ...
}
Run Code Online (Sandbox Code Playgroud)

  • sessionFactoryImplementation.getConnectionProvider()被删除 (7认同)