Hibernate ReturningWork<Long> 接口的目的是什么?

jag*_*tre 9 java orm spring hibernate jdbc

我正在开发一个 JAVA + Hibernate 项目,但目前,我在我的代码(即ReturningWork<Long>)中看到了一个接口,其中有一个名为execute(java.sql.Connection).

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

Tho*_*sen 10

正如我在我的博客中更详细地解释的那样,您可以使用ReturningWork和 Work 接口来实现任何需要直接访问java.sql.ConnectionHibernate 会话所使用的 的逻辑。

这是一个简单的示例,它使用该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.");
Run Code Online (Sandbox Code Playgroud)


Vla*_*cea 10

休眠会话休眠 Session doReturningWork

HibernateSession doReturningWork方法具有以下签名:

<T> T doReturningWork(ReturningWork<T> work) throws HibernateException;
Run Code Online (Sandbox Code Playgroud)

ReturningWork界面如下所示:

public interface ReturningWork<T> {
    public T execute(Connection connection) throws SQLException;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Session session = entityManager.unwrap(Session.class);

int isolationLevel = session.doReturningWork(
    connection -> connection.getTransactionIsolation()
);

assertEquals(
    Connection.TRANSACTION_READ_COMMITTED, 
    isolationLevel
);
Run Code Online (Sandbox Code Playgroud)

何时使用doWorkdoReturningWork

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

但是,如果要访问底层 JDBCConnection方法并通过 JDBC API 执行任何可能的操作,则需要使用doWorkdoReturningWorkHibernateSession方法。