使用触发器停止插入而不将错误传播到服务器端Java代码

时间:2016-02-12 09:59:37

标签: java sql oracle hibernate plsql

有一个使用Hibernate的Java EE webapp,我无法访问的代码,所以我无法修改或看到它。我只能访问Oracle数据库。

我必须根据某些条件创建一个避免插入操作的触发器。这是我现在拥有的<test_adminhtml_index_index> <reference name="content"> <block type="test/adminhtml_grid" name="info_list" /> </reference> </test_adminhtml_index_index> <test_adminhtml_index_edit> <reference name="content"> <block type="test/adminhtml_info_edit" name="info_edit" /> </reference> <reference name="left"> <block type="test/adminhtml_info_edit_tabs" name="info_tabs"></block> </reference> </test_adminhtml_index_edit> 触发器的相关代码:

BEFORE INSERT

这很好但问题是,这会抛出一个错误,无论如何都将传播到webapp服务器端代码... if var_some_value = :new.another_value then RAISE_APPLICATION_ERROR(-12345, 'The insert will not be executed'); end if; ... 或其他类型的Exception。

这是不好的,因为其中一个要求是java webapp一定不会注意到插件没有完成,所以java代码不应该抛出任何异常。

还有其他方法可以更安静的方式停止插入行吗?

也许我应该采用另一种策略,例如SQLException触发器,删除刚插入的行(如果需要)。为此,我需要使用自治事务,执行插入并提交它,然后删除它是否满足条件。但如果可能的话,我更愿意使用AFTER INSERT方法。

关于如何做到这一点的任何想法?谢谢!

1 个答案:

答案 0 :(得分:3)

实现此目的的唯一方法可能是创建视图并将应用程序插入到视图中。然后,视图上的替代触发器可以处理视图上的insert语句,并决定是否实际插入到表中。