从jOOQ Manual开始,至少对我来说,如何正确配置乐观锁定尚不清楚。
<!-- All table and view columns that are used as "version" fields for
optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
See UpdatableRecord.store() and UpdatableRecord.delete() for details -->
<recordVersionFields>REC_VERSION</recordVersionFields>
及以下
recordVersionFields: Relevant methods from super classes are overridden to return the VERSION field
它究竟意味着什么?有人可以提供一个例子吗?
想象一下,如果有这个表,例如:
CREATE TABLE "users" (
"id" INTEGER DEFAULT nextval('global_seq') NOT NULL,
"code" TEXT NOT NULL,
"version" INTEGER NOT NULL
);
我应该将recordVersionFields
放入pom.xml?
<database>
<inputSchema>PUBLIC</inputSchema>
<recordVersionFields>users.version</recordVersionFields>
</database>
users.version
,version
,RECORD_VERSION
?
我使用H2数据库,如果我只设置version
则会出现编译错误。
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /D:/JooqDemo/target/generated-sources/jooq-h2/org/jooqdemo/generated/tables/SchemaVersion.java:[152,52] getRecordVersion() in org.jooqdemo.generated.tables.SchemaVersion cannot implement getRecordVersion() in org.jooq.Table
return type org.jooq.TableField<org.jooqdemo.generated.tables.records.SchemaVersionRecord,java.lang.String> is not compatible with org.jooq.TableField<org.jooqdemo.generated.tables.records.SchemaVersionRecord,? extends java.lang.Number>
答案 0 :(得分:2)
您可以提供给代码生成器的所有这些正则表达式模式都是通过其非限定名称(例如version
)或其名称匹配模式,表或列的模式完全限定名称(例如public.users.version
)。您不能使用部分限定名称,例如users.version
。
要回答您的具体问题,以下是可行的示例:
<!-- Will match version columns in all tables -->
<recordVersionFields>version</recordVersionFields>
<!-- Will match version columns in all user tables.
Notice that schema names are matched by .* -->
<recordVersionFields>.*\.user\.version</recordVersionFields>
<!-- Will match version columns only in that particular public.user table -->
<recordVersionFields>public\.user\.version</recordVersionFields>
这会在您的UserRecord
中生成相关的元信息,以便在UserRecord.store()
,update()
和delete()
来电时启用乐观锁定。
在您的问题中,您提到了一个似乎发生的编译错误,因为您匹配所有表中的所有版本列:
<!-- Will match version columns in all tables -->
<recordVersionFields>version</recordVersionFields>
这也会匹配“错误的”版本列,例如在schema_version
表中,其类型为VARCHAR
而不是INTEGER
。也许,您应该更明确地使用正则表达式进行精确匹配。
所有这些正则表达式都区分大小写。如果您正在使用PostgreSQL,那么以下可能是错误的:
<inputSchema>PUBLIC</inputSchema>
相反,请写下以下任何内容:
<!-- use lower-case in PostgreSQL by default -->
<inputSchema>public</inputSchema>
<!-- use case-insensitive regular expressions to "stay safe" -->
<inputSchema>(?i:PUBLIC)</inputSchema>