Java 在JOOQ'中插入/更新地图的访问权限;s执行董事

Java 在JOOQ'中插入/更新地图的访问权限;s执行董事,java,postgresql,jooq,Java,Postgresql,Jooq,我正在尝试实现一些应用程序级数据触发器,它们将替换现有的DB触发器。这些都是非常简单的触发器,由“表T1 do X中字段F1更新时”定义。我使用JOOQ作为持久层,触发器实现为 我正在重写executend(),并从上下文中获取Query对象。我可以看到,实现--updatequalyimpl(用于更新)有一个非常方便的updateMap,我可以检查它,以找到哪些字段发生了更改,以及新值是什么。但是,我找不到任何公共方法来访问它 当然,我可以尝试解析SQL字符串,但这似乎更容易出错。我试图避免使

我正在尝试实现一些应用程序级数据触发器,它们将替换现有的DB触发器。这些都是非常简单的触发器,由“表T1 do X中字段F1更新时”定义。我使用JOOQ作为持久层,触发器实现为

我正在重写
executend()
,并从上下文中获取
Query
对象。我可以看到,实现--
updatequalyimpl
(用于更新)有一个非常方便的updateMap,我可以检查它,以找到哪些字段发生了更改,以及新值是什么。但是,我找不到任何公共方法来访问它

当然,我可以尝试解析SQL字符串,但这似乎更容易出错。我试图避免使用反射,除非我真的不得不这样做,因为所有明显的原因

还有其他想法吗


我使用的是Jooq版本3.10.8,DB is postgres 9.6

一般来说,DB服务器功能通常应该优先于客户端功能。例如,在触发器的情况下,您总是有可能错过对给定表的
更新。例如,如果您有一个使用普通SQL的jOOQ查询,另一个应用程序使用普通JDBC或JPA,或者一些SQL脚本(例如迁移),或者由
合并触发的更新,等等

如果不想使用触发器,还可以使用PostgreSQL的
NOTIFY
机制。有关这方面的一些注释,请参见和

话虽如此,jOOQ也提供了一些选择。正如您所发现的,
ExecuteListener
SPI没有用于遍历SQL查询的API。有计划在未来的版本中解决这个问题,但现在你必须将你的
执行器
与。这是一个非常强大的SPI,但不适合胆小的人,因为它同时也是相当低级的。另请参见以获取示例


为了完整起见,我还应该提到jOOQ的。如果您只需要使用操作所做更改的通知,这将适用。

我一定会查看VisitListener。如果我理解正确的话,Notify的问题在于它不会与触发代码在同一事务中运行,这对我的解决方案至关重要。您为什么要替换这些触发器?@LukasEder我担心使用触发器很难维护一些业务需求-以特定格式记录审计日志(当然,我可以从触发器登录,但不会有完整的上下文)、周期检测、授权(需要一些领域知识)、功能切换。此外,触发器的创建本身对于Java开发人员来说并不容易,大多数人对PLSQL不是很有经验。如果JOOQ只能支持触发器创建…;-)综上所述,我正在考虑创建一个框架,允许开发人员使用Java flyway类和一些Jooq(用于创建表达式)创建这样的触发器,并将所有交叉关注点烘焙到触发器中。这是一项可怕的任务,但可能比不上VisitListener。有一些方法可以为PostgreSQL提供一些额外的上下文:。jOOQ将很快支持触发器的创建:,但首先我们必须“仅仅”支持整个过程语言,我们仍在研究:),并且您仍然需要通过jOOQ使用过程语法,这样您就不会获得太多好处。触发器是一个更好的选择,因为否则,您将依赖于通过jOOQ执行的每个操作。想象一下用Perl编写的快速迁移脚本。。。