背景:
现在有个主键自增的表A,然后在表A上有个insert触发器,这个insert触发器对表A还搞了点事情,结果,在使用
useGeneratedKeys="true"
时,在insert传入的entity中是得不到要自增的键值的.
改用Mybatis的selectkey,如果selectKey里面写的是
Select @@IDENTITY;
则能取到值,但按照MS的官方文档,这个@@IDENTITY返回的是
the last identity column value inserted across any scope in the current session. 官网说明
这就不能保证取到的值是本次insert语句插入的值,需要使用SCOPE_IDENTITY(),
而SCOPE_IDENTITY是需要保证和insert语句在同一个scope执行,mybatis的selectkey不是和insert在同一个scope中执行的,应该是分不同的statement执行的,所以,SCOPE_IDENTITY()一直返回null.
解决办法:
在insert节点的selectkey中,把insert语句和select SCOPE_IDENTITY()合在一起执行,也就是像下面这样
<insert ....>
<selectkey .....>
insert into .....
values ......;
select SCOPE_IDENTITY()
</selectkey>
</insert>
这样之后,问题就圆满解决了,知道了这个原因,更NB的办法应该是可以修改下MyBatis的源码的