【问题标题】:What is the purpose of the Hibernate ReturningWork<Long> interface?Hibernate ReturningWork<Long> 接口的目的是什么?
【发布时间】:2019-01-24 03:32:46
【问题描述】:

我正在开发一个 JAVA + Hibernate 项目,但目前,我在我的代码中看到了一个接口(即ReturningWork&lt;Long&gt;),它有一个名为execute(java.sql.Connection) 的方法。

我的问题是这个ReturningWork接口有什么用?

【问题讨论】:

    标签: java spring hibernate jdbc orm


    【解决方案1】:

    休眠会话休眠SessiondoReturningWork

    Hibernate Session doReturningWork 方法具有以下签名:

    <T> T doReturningWork(ReturningWork<T> work) throws HibernateException;
    

    ReturningWork 界面如下所示:

    public interface ReturningWork<T> {
        public T execute(Connection connection) throws SQLException;
    }
    

    因此,与doWork 方法不同,doReturningWork 允许我们将对象返回给方法调用者。

    例如,我们可以使用doReturningWork方法来获取当前的事务隔离级别:

    Session session = entityManager.unwrap(Session.class);
    
    int isolationLevel = session.doReturningWork(
        connection -> connection.getTransactionIsolation()
    );
    
    assertEquals(
        Connection.TRANSACTION_READ_COMMITTED, 
        isolationLevel
    );
    

    何时使用doWorkdoReturningWork

    一般来说,您可以使用 JPA 或 Hibernate 特定的 API 来执行 SQL 语句或调用数据库过程或函数。

    但是,如果您想访问底层的 JDBC Connection 方法并通过 JDBC API 执行任何可能的操作,那么您需要使用 doWorkdoReturningWork Hibernate Session 方法。

    【讨论】:

      【解决方案2】:

      正如我在 on my blog 中详细解释的那样,您可以使用 ReturningWork 和 Work 接口来实现需要直接访问 Hibernate 会话使用的 java.sql.Connection 的任何逻辑。

      这是一个简单的例子,它使用ReturningWork 接口执行一个非常简单的查询(您也可以使用JPQL 实现)并返回结果。

      Session session = em.unwrap(Session.class);
      Integer bookCount = session.doReturningWork(new ReturningWork<Integer>() {
      
          @Override
          public Integer execute(Connection con) throws SQLException {
              // do something useful
              try (PreparedStatement stmt = con.prepareStatement("SELECT count(b.id) FROM Book b")) {
                  ResultSet rs = stmt.executeQuery();
                  rs.next();
                  return rs.getInt(1);
              }
          }
      });
      
      log.info("Found " + bookCount + " books.");
      

      【讨论】:

      • 别忘了关闭你的结果集,因为它会导致内存泄漏:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多