【发布时间】:2012-01-27 15:04:06
【问题描述】:
我已经定义了一个 PL/SQL 存储过程,它返回一个 SYS_REFCURSOR
CREATE OR REPLACE PROCEDURE findByName
( res OUT SYS_REFCURSOR,
vName IN emp.name%type ) AS
BEGIN
OPEN res FOR
SELECT * FROM emp WHERE name = vName;
END findByName;
然后,我将返回的光标映射到 Hibernate 实体。
....
@Entity
@org.hibernate.annotations.NamedNativeQuery(name = "findByName", query = "call findByName(?, :vName)", callable = true, resultClass = Employee.class)
@Table(name = "EMP", schema = "WEBUI")
public class Employee implements java.io.Serializable {
....
这是一个调用存储过程的DAO方法。
....
public Employee findByName(final String name) {
Session session = factory.getSession();
Query query = session.getNamedQuery("findByName");
query.setString("vName", name);
return (Employee) query.uniqueResult();
}
....
如果我从 PL/SQL 代码调用存储过程,我会这样做。
DECLARE
emp_cursor SYS_REFCURSOR;
emp_rec emp_cursor%ROWTYPE;
BEGIN
findByName
( res => emp_cursor,
vName => 'Timothy Jones');
FETCH emp_cursor
INTO emp_rec;
DBMS_OUTPUT.PUT_LINE(emp_rec.name);
CLOSE emp_cursor; -- close the cursor
END;
我想强调一个事实,即有必要以某种方式关闭emp_cursor。否则会导致内存泄漏。
我的问题是: Hibernate 是如何处理这个问题的?是在 Employee 对象被检索后自动关闭光标还是程序员必须手动关闭它?
提前致谢。
【问题讨论】:
-
我认为这个链接或多或少回答了我的问题:zugiart.com/2010/08/handling-oracle-cursors-in-jdbc