【发布时间】:2019-01-24 03:32:46
【问题描述】:
我正在开发一个 JAVA + Hibernate 项目,但目前,我在我的代码中看到了一个接口(即ReturningWork<Long>),它有一个名为execute(java.sql.Connection) 的方法。
我的问题是这个ReturningWork接口有什么用?
【问题讨论】:
标签: java spring hibernate jdbc orm
我正在开发一个 JAVA + Hibernate 项目,但目前,我在我的代码中看到了一个接口(即ReturningWork<Long>),它有一个名为execute(java.sql.Connection) 的方法。
我的问题是这个ReturningWork接口有什么用?
【问题讨论】:
标签: java spring hibernate jdbc orm
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
);
doWork 和doReturningWork?一般来说,您可以使用 JPA 或 Hibernate 特定的 API 来执行 SQL 语句或调用数据库过程或函数。
但是,如果您想访问底层的 JDBC Connection 方法并通过 JDBC API 执行任何可能的操作,那么您需要使用 doWork 和 doReturningWork Hibernate Session 方法。
【讨论】:
正如我在 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.");
【讨论】: