我已經定義了一個PL/SQL存儲過程,它返回一個SYS_REFCURSOR
Hibernate是否自動關閉參考光標?
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對象被檢索後自動關閉遊標或程序員是否必須手動關閉它?
在此先感謝。
我想這個鏈接或多或少地回答我的問題: http://www.zugiart.com/2010/08/handling-oracle-cursors-in-jdbc/ – 2012-01-30 09:34:11