如何从休眠会话中获取 jdbc 连接? [复制]

Posted

技术标签:

【中文标题】如何从休眠会话中获取 jdbc 连接? [复制]【英文标题】:How to get jdbc connection from hibernate session? [duplicate] 【发布时间】:2012-03-17 23:18:56 【问题描述】:

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

【问题讨论】:

如果有人将问题标记为重复问题,请附上一个链接,指向已经有答案的其他问题之一, 【参考方案1】:

我遇到了类似的问题,我使用ConnectionProvider 类来获取连接。查看我的解决方案:

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

【讨论】:

你能简单解释一下这是如何解决问题的吗? sessionFactoryImplementation.getConnectionProvider() 被贬低 我在 Hibernate 5.2.9 中看不到该方法【参考方案2】:

试试这个:

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

【讨论】:

致任何未经警告来到这里的人(就像我一样):Session.connection 方法目前已被弃用。 永远不要转换为 Impl!它的内部! (org.hibernate.internal.SessionImpl)。而且你不能再用模拟来测试这段代码了。这很糟糕,原因有很多。【参考方案3】:

这里是你如何使用它:

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

【讨论】:

问题:我收到了doWork is not valid without active transaction这个代码,我该如何开始交易? @OscarRyz:如果您使用的是 Spring,@TransactionalTransactionTemplate 就足够了。在原始 Hibernate 中,您必须 run session.beginTransaction() manually. 嗨,伙计.. 不错的答案,但 doWork() 现在也已弃用。 @Logicalj:你能提供一些参考吗?这是still valid in 4.1... 另外值得一提的是,如果要返回结果,还有一个doReturningWork(...)方法。

以上是关于如何从休眠会话中获取 jdbc 连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无法为事务打开休眠会话/无法打开连接 [关闭]

从休眠中的会话中删除对象? [复制]

如何从数据库中获取数据以及会话如何在 laravel 中工作? [复制]

如何将 jdbc 连接器连接到 MySql 数据库服务器? [复制]

如何在 jmeter 中关闭 JDBC 连接

从会话工厂以编程方式获取休眠默认模式名称?