在Hibernate测试事务期间,Oracle存储过程返回不正确的值

时间:2014-07-21 01:30:52

标签: oracle hibernate stored-procedures transactions junit4

我有一个测试类,它扩展了AbstractTransactionalJUnit4SpringContextTests并使用Transactions进行集成测试。其中一个测试方法使用Hibernate从Oracle数据库调用存储过程,使用命名查询。

存储过程更新其中一行中的列的值(默认情况下,STATUS为" 0"),然后提交,然后返回相同的更新值:

create or replace PROCEDURE TEST_PROCEDURE(
    p_cursor OUT SYS_REFCURSOR,
    p_id IN NUMBER)
AS
BEGIN
    UPDATE TABLE_SMPL
    SET STATUS = '1'
    WHERE REQUEST_ID IN 
       (SELECT TESTVAR.REQUEST_ID 
        FROM
         (SELECT REQUEST_ID  
            FROM TABLE_SMPL
            WHERE ID = p_id )  TESTVAR);
    commit;

    OPEN p_cursor FOR
      SELECT REQUEST_ID  
                FROM TABLE_SMPL
                WHERE ID = p_id AND STATUS = '1';

END TEST_PROCEDURE;

测试失败。调试我看到调用了存储过程,并更新了数据库中的值。但是Store Procedure的返回值是没有更新值的行(返回的行有STATUS = 0)。

如果我在SQL Developer中调用此存储过程,它可以正常工作。它会更新值,并返回正确的更新行。

如果我在方法中使用Hibernate语句而不是存储过程,它也可以正常工作。

为什么存储过程没有在我的Java方法中返回正确的值?

谢谢和问候。

修改

我觉得有一点奇怪的是,我在调试时得到的结果与运行测试时的结果不同:运行它通常会返回0结果,但在调试模式下它返回一个结果,并带有未更新的值。

修改2

没关系,在正常运行和调试模式下导致结果的差异是因为我在SELECT中引入了另一个失败的条件。

0 个答案:

没有答案