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

时间:2016-06-14 16:16:05

标签: java sql jooq optimistic-locking

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.versionversionRECORD_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 个答案:

答案 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>