我们正在开发一个前端应用程序,它将新数据添加到GeoServer层 . 前端使用WFS-T插入调用来添加此数据 . 我们在GeoServer中为这些图层使用视图,以进行一些额外的处理 . 我们使用的视图是在我们的Oracle数据库本身上创建的数据库视图(例如,我们不使用GeoServer的SQL视图) . 基于视图的这些层工作得很好(解决方案应用于视图的禁用“主键”,如互联网上其他地方所述) .

我们使用的视图包含一个唯一的ID,它是视图中使用的“主”表的唯一ID . 对于“主”表的ID的唯一创建,我们选择通过Oracle中定义的序列来创建此ID . 要在GeoServer中使用此序列,您可以提供此“元数据”,如文档所示:http://docs.geoserver.org/stable/en/user/data/database/primarykey.html

此解决方案工作正常,除非您在数据库视图上使用(插入)触发器 .

创建或替换TRIGGER OUR_VIEW_TRG,而不是在每行的vw_our_view上插入或更新或删除...

如果我们执行WFS-T插入调用,则会导致以下异常:

org.geoserver.wfs.WFSTransactionException:执行插入时出错:插入功能时出错执行插入时出错:插入功能时出错插入功能错误ORA-22816:RETURNING子句不支持的功能

在没有指示GeoServer使用序列的情况下,我们返回了一个特征ID,它与我们对表的ID的序列编号不对应(GeoServer只返回表的行数加一) . 这导致了一种不期望的情况,即在WFS-T插入之后我们在前端处具有不正确的ID,仅在刷新浏览器之后才提取正确的ID .

有没有人知道是否有办法使这项工作,例如对于我们的客户自己更改GeoServer代码,因此创建我们的“自己的”GeoServer版本是没有选择的 . 停止使用视图意味着我们的FrontEnd应用程序会进行额外的WFS-T插入调用 .