如何在jOOQ中配置乐观锁定?

4
jOOQ 手册 来看,至少对我来说,如何正确配置乐观锁并不清楚。
 <!-- 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>

and below

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
);

我应该在pom.xml文件中放什么内容到recordVersionFields中呢?
<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>
1个回答

5

您可以为代码生成器提供的所有正则表达式模式都是匹配模式、表格或列的模式,可以通过它们的未限定名称(例如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>

这也将匹配“错误”版本的列,例如在类型为VARCHAR而非INTEGERschema_version表中。也许,你应该用更明确的正则表达式进行精确匹配。
注:大小写敏感
所有这些正则表达式都是大小写敏感的。如果你正在使用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>

感谢您的解释。然而,我从生成器中得到了编译错误。我已经添加到原始帖子中。 - Nikolay Kuznetsov
@NikolayKuznetsov:编译错误发生的原因是您的某些“version”列不是“INTEGER”类型,而是“VARCHAR”类型。也许您不应该匹配所有“version”列。我会在答案中添加这个信息。 - Lukas Eder
是的,谢谢。我没有意识到Flyway会在H2中生成那个schema_version表。 - Nikolay Kuznetsov
@LukasEder,生成的POJO代码有什么区别吗?我没有看到任何区别,或者我的生成器配置不正确...谢谢。 - Gadi
@Gadi:我不确定,我不知道你配置了什么。你介意问一个新问题吗?编辑:我看到你刚刚创建了这个问题:https://github.com/jOOQ/jOOQ/issues/5706。我会在那里回答。 - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接