You have, of course, several options to implement audit trails.
If you want to stay 100% sure to catch all updates, database triggers are your best way to go, here.
Otherwise, from a jOOQ perspective, RecordListener is the easiest to help you implement audit trails, although it will limit your application design by enforcing all updates to go via UpdatableRecord.store() and similar.
While you could delve into a harder-to-implement, yet possibly more reliable solution based on VisitListeners, there will always be cases involving bulk DML that you won't be able to catch, and that can be covered using triggers, only:
- MERGE statement
- INSERT .. SELECT statements
- Multi-row UPDATE statements
If others want to share their actual experience, I think that would be very interesting for the group.
Hope this helps,
Lukas