Hibernate автоматически закрывает опорный курсор? - PullRequest
1 голос
/ 27 января 2012

Я определил хранимую процедуру 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 был получен, или программист должен закрыть его вручную?

Заранее спасибо.

1 Ответ

1 голос
/ 27 января 2012

У вас нет возможности закрыть этот курсор. Ссылка Hibernate требует, чтобы вы возвращали курсор при использовании хранимой процедуры для запроса.

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#sp_query

Я предполагаю, что hibernate переводит возвращенный курсор в ResultSet, используемый для перебора результатов запроса. Было бы серьезной ошибкой гибернации, если ResultSet остается открытым. В любом случае этот ResultSet в худшем случае закрывается, когда пул соединений с базой данных перезагружает / закрывает соединение / оператор jdbc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...