环境:Spring应用程序,使用JOOQ 3.7,使用Postgres作为我的数据库,自动从模式生成JOOQ映射代码.
我一直在将一些代码从Hibernate移植到JOOQ.Hibernate代码在每个上下文的基础上提取一些身份验证细节,以填充"createdBy","updatedBy",日期等字段.
我目前只能通过JOOQ看到这样做的唯一方法是开发人员必须记住编写代码以便在每次更新对象时手动更新字段,我可以看到它会很乏味且容易忘记填充字段.
使用JOOQ,我是否有办法以更好的方式处理每个表上的"历史字段",而不是手工编写一堆代码?
我们目前不使用DAO,我宁愿避免编写/生成整个代码层来处理这些历史字段.
另一个选择可能是在数据库中执行此操作,如果JOOQ无法帮助解决问题,那么很可能就是我们要做的.
使用jOOQ有几种方法可以做到这一点:
RecordListener生成这些值UpdatableRecord该RecordListenerSPI调用每次调用任何时间:
TableRecord.insert()UpdatableRecord.store()UpdatableRecord.update()UpdatableRecord.delete()UpdatableRecord.refresh()但是,在编写明确的DML语句时,不会调用此SPI.有关更多信息,请参阅手册,此处:
VisitListener转换jOOQ生成的所有SQL语句该VisitListenerSPI是有任意SQL转换操作.您可以截取由jOOQ生成的各种SQL语句,并为它们添加其他子句,例如
UPDATE table SET a = 1, b = 2 WHERE id = 3
Run Code Online (Sandbox Code Playgroud)
会成为
UPDATE table SET a = 1, b = 2, updatedBy = 'me' WHERE id = 3
Run Code Online (Sandbox Code Playgroud)
本手册中记录了此SPI:
在我看来,最好的解决方案是使用触发器将这种自动生成的数据移动到数据库中.这将允许您在迁移,手动更新或通过Java之外的其他语言(例如Perl脚本等)进行迁移时更新这些值.
有一个jOOQ 3.10的待处理功能请求:
它将精确地实现此功能,以及其他一些不错的补充,例如二维版本控制:
| 归档时间: |
|
| 查看次数: |
837 次 |
| 最近记录: |