我正在使用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中手动运行插入,它就会起作用。
(有一些类似的问题,但它们并不完全相同,它们已经陈旧,并没有真正提供一些令人满意的答案)。
答案 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。
要解决此问题,您需要将这些组合成对数据库的单个调用,该数据库将插入数据并返回新密钥。