执行CallableStatement会阻止应用程序

时间:2016-03-08 08:09:42

标签: java oracle stored-procedures hibernate-entitymanager

我有一个使用JBoss 5.1在Java 6上编写的后端服务器。我必须将该代码上的Oracle过程(存储在包上)调用到以下方法中:

cs = conn.prepareCall("{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}");

        cs.setString(1, <data>);
        cs.setString(2, <data>);
        cs.setString(3, <data>);
        cs.setDate(4, <data>);
        cs.setString(5, <data>);

        cs.registerOutParameter(6, Types.VARCHAR);
        cs.registerOutParameter(7, Types.VARCHAR);
        cs.registerOutParameter(8, Types.BIGINT);

        cs.setInt(9, <data>);


        try{
            cs.execute();
        }catch (RuntimeException e){
            e.getMessage();
        }catch (Exception e){
            e.getMessage();
        }


        Long numerr   = cs.getLong(8);

当我拨打cs.execute()时出现问题。该调用会阻止执行,无法继续正常执行并保留数据。

有必要说这个程序正常执行插入数据到基于第三个表的另一个表中,我在其中先插入了正常类创建的数据和{{1 }和EntityManager.persist(<entity>)

这不是授予权限问题,因为我可以使用正确的句子和正确的用户/密码在 SQLDeveloper 上执行该过程。

1 个答案:

答案 0 :(得分:0)

最后我发现了什么问题。您不能同时使用EntityManager来持久保存实体,然后执行您必须本机调用的过程。因此,解决方案是本机地保留我的实体(通过插入,使用PreparedStatemnt);

"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)"

然后以正确的方式执行该程序:

"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"

原因似乎是你不能以两种不同的执行方式执行相同的@Transactional方法:EntityManager persist-way和native procedure execution-way。

我希望这可以帮助任何人: - )