MyBatis with SQL Server:SELECT SCOPE_IDENTITY()不设置指定的键

时间:2017-10-30 21:47:20

标签: sql-server mybatis

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

插入新对象时,我无法使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中手动运行插入,它就会起作用。

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

2 个答案:

答案 0 :(得分:1)

我回复了您的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")

答案 1 :(得分:0)

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

要解决此问题,您需要将这些组合成对数据库的单个调用,该数据库将插入数据并返回新密钥。