如何从休眠会话中获取 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,@Transactional
或 TransactionTemplate
就足够了。在原始 Hibernate 中,您必须 run session.beginTransaction()
manually.
嗨,伙计.. 不错的答案,但 doWork() 现在也已弃用。
@Logicalj:你能提供一些参考吗?这是still valid in 4.1...
另外值得一提的是,如果要返回结果,还有一个doReturningWork(...)方法。以上是关于如何从休眠会话中获取 jdbc 连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何从数据库中获取数据以及会话如何在 laravel 中工作? [复制]