【问题标题】:How to get jdbc connection from hibernate session? [duplicate]如何从休眠会话中获取 jdbc 连接? [复制]
【发布时间】: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 但我没有找到任何示例?

【问题讨论】:

  • 如果有人将问题标记为重复问题,请附上一个链接,指向已经有答案的其他问题之一,

标签: java hibernate jdbc


【解决方案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(...)方法。
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 2011-05-29
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多