MyBatis with SQL Server: SELECT SCOPE_IDENTITY() 没有设置分配的键

MyBatis with SQL Server: SELECT SCOPE_IDENTITY() does not set the assigned key

我在 Java 8 和 SQL Server 2014 上使用 MyBatis 3.4.5。

当插入一个新对象时,我无法让 insert 方法设置分配的标识键,id 字段留下 null 值。

这是我的设置:

public class TestMapper {
    @Insert({ "insert into TEST (VAL_INT) values " +
          "(#{valInt,jdbcType=INTEGER})" })
    @SelectKey(statement = "SELECT SCOPE_IDENTITY()", keyProperty = "id", before = false, resultType = Integer.class)
    int insert(Test record);
}

public class Test {

    private Integer id;
    // ...  other fields and getters/setters follow
}

CREATE TABLE [dbo].[TEST] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VAL_INT] [int] NULL,
 CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED ( [ID] ASC)

我检查过 setId() 确实在插入后被调用,但具有 null 值。这一切都好像 SELECT SCOPE_IDENTITY() 返回了 NULL - 如果我 运行 在 Management Studio 中手动插入,它就会工作。

(有一些类似的问题,但不完全相同,它们是旧的,并没有真正提供令人满意的答案)。

SCOPE_IDENTITY() 显示在该范围内创建的最新标识符。但是您有两个单独的数据库调用,这意味着您有两个范围,并且在第二个范围中,当您尝试获取 ID 时,您还没有为该范围创建一个 ID。

要解决此问题,您需要将这些合并到对插入数据和 returns 新密钥的数据库的单个调用中。

我回复了你的 mybatis 用户列表电子邮件,但你可以这样做:

在xml我使用:

<insert id="insertFoo" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into TEST (VAL_INT) values (#{valInt,jdbcType=INTEGER})
</insert>

在 java 注释中:

@Insert({ "insert into TEST (VAL_INT) values (#{valInt,jdbcType=INTEGER})" })
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")