2012-02-28 49 views
37

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

+2

如果有人标志着一个问题,重复请包括一个链接到的是已经有一个答案的其他问题之一, – 2015-10-01 09:15:00

回答

74

这里是你如何使用它:

session.doWork(new Work() { 
    @Override 
    public void execute(Connection connection) throws SQLException { 
     //connection, finally! 
    } 
}); 
+0

问:我得到'如果没有使用此代码的活动事务,doWork是无效的,如何启动事务? – OscarRyz 2012-12-06 20:52:46

+2

@OscarRyz:如果你使用Spring,'@ Transactional'或'TransactionTemplate'就足够了。在原始Hibernate中,你必须[手动运行session.beginTransaction()](http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics)。 – 2012-12-06 20:55:39

+0

嗨,好友..好的答案,但doWork()现在也被弃用。 – Logicalj 2013-01-09 10:33:42

11

我有一个类似的问题,我用ConnectionProvider类来获取连接。见我的解决方案:

Session session = entityManager.unwrap(Session.class); 
SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory(); 
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider(); 
try { 
     connection = connectionProvider.getConnection(); 
     ... 
} 
+1

你能添加的简要说明这是如何解决问题的? – Ren 2013-04-26 11:23:59

+4

sessionFactoryImplementation.getConnectionProvider()被depricated – vels4j 2015-02-18 17:41:51

21

试试这个:

((SessionImpl)getSession()).connection() 
+6

要人谁得到这里未警告(就像我):在['Session.connection'](http://docs.jboss.org/hibernate/core/3.5/api/org/ hibernate/Session.html#connection%28%29)方法目前已被弃用。 – Dinei 2015-06-13 21:20:08

+2

永远不会投给Impl!它的内部! (org.hibernate.internal.SessionImpl)。而且你不能再用模拟来测试这个代码。这很糟糕,原因很多。 – Rainer 2016-06-27 17:16:04