如果自增字段不是第一个,jOOQ 可以支持复合主键吗
Can jOOQ support composite primary keys if auto-increment field isn't the first one
我正在使用 jOOQ (3.14.11) 来管理 table 定义(在 H2 或 MYSQL 中)为:
CREATE TABLE example_one (
group_id VARCHAR(36) NOT NULL,
pawn_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
some_unimportant_attribute INT UNSIGNED DEFAULT 0 NOT NULL,
another_uniportant_attribute VARCHAR(36),
CONSTRAINT pk_example_one PRIMARY KEY (group_id, pawn_id)
)
请注意,在这个SQL中,主键按顺序指定(group,pawn)ID,但它是pawn_id
,第二个是auto-increment/identity 列。
看来jOOQ不喜欢这种安排。当我尝试使用 Record 对象插入新行时,它不会 return 返回给我“pawnID”值:
ExampleOneRecord r = create.newRecord(EXAMPLE_ONE);
r.setGroup("a group identity");
r.store();
assert r.getPawnId() != null; // <---- FAILS test
深入研究代码,嫌疑人似乎是 in AbstractDMLQuery.java method executeReturningGeneratedKeysFetchAdditionalRows,它具有以下逻辑:
// Some JDBC drivers seem to illegally return null
// from getGeneratedKeys() sometimes
if (rs != null)
while (rs.next())
list.add(rs.getObject(1));
对rs.getObject(1)
的调用似乎假设生成的列将始终是主键的第一列。
有什么办法可以说服 jOOQ 吗?
这是 jOOQ 3.15.1 中 H2 的错误:https://github.com/jOOQ/jOOQ/issues/12192
它已在 H2 2.0.202 的 jOOQ 3.16.0 中修复,现在支持强大的数据更改增量 table 语法,允许更容易地从 DML 语句中获取生成的值(它是在 H2 版本之前实现,但有一个重大错误:https://github.com/h2database/h2database/issues/2502)
我正在使用 jOOQ (3.14.11) 来管理 table 定义(在 H2 或 MYSQL 中)为:
CREATE TABLE example_one (
group_id VARCHAR(36) NOT NULL,
pawn_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
some_unimportant_attribute INT UNSIGNED DEFAULT 0 NOT NULL,
another_uniportant_attribute VARCHAR(36),
CONSTRAINT pk_example_one PRIMARY KEY (group_id, pawn_id)
)
请注意,在这个SQL中,主键按顺序指定(group,pawn)ID,但它是pawn_id
,第二个是auto-increment/identity 列。
看来jOOQ不喜欢这种安排。当我尝试使用 Record 对象插入新行时,它不会 return 返回给我“pawnID”值:
ExampleOneRecord r = create.newRecord(EXAMPLE_ONE);
r.setGroup("a group identity");
r.store();
assert r.getPawnId() != null; // <---- FAILS test
深入研究代码,嫌疑人似乎是 in AbstractDMLQuery.java method executeReturningGeneratedKeysFetchAdditionalRows,它具有以下逻辑:
// Some JDBC drivers seem to illegally return null
// from getGeneratedKeys() sometimes
if (rs != null)
while (rs.next())
list.add(rs.getObject(1));
对rs.getObject(1)
的调用似乎假设生成的列将始终是主键的第一列。
有什么办法可以说服 jOOQ 吗?
这是 jOOQ 3.15.1 中 H2 的错误:https://github.com/jOOQ/jOOQ/issues/12192
它已在 H2 2.0.202 的 jOOQ 3.16.0 中修复,现在支持强大的数据更改增量 table 语法,允许更容易地从 DML 语句中获取生成的值(它是在 H2 版本之前实现,但有一个重大错误:https://github.com/h2database/h2database/issues/2502)