私はその後、私はHibernateのエンティティに戻さカーソルをマップ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;
を返すPL/SQLストアド・プロシージャを定義しています。
....
@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/ –