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")
我在 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")