Programming/iBatis
MS-SQL서버를 iBatis와 사용할 때 <selectKey>사용시 유의사항
otamot
2011. 7. 21. 18:05
MS-SQL 서버를 iBatis를 사용할 때 insert처리하고 바로 identity값을 얻고자할 때 <selectKey>태그를 이용합니다. 이 때 SCOPE_IDENTITY()를 이용할 것을 권장합니다. 그러면서 대부분의 설명이 다음과 같이 되어 있습니다.
하지만 위와같이 처리하면 다음과 같은 exception 발생합니다.
위 오류를 해결하기 위해 상당수의 시간을 소비하였고 결국은 다음과 같이 해야 문제가 발생하지 않고 올바로 수행한다는 것을 발견했습니다.
위에서 처럼 'SELECT SCOPE_IDENTITY()'를 사용하지 않고 'SELECT IDENT_CURRENT('table')'를 사용한다면 최상단의 로직으로 수행해도 잘 수행이 됩니다. 하지만 SELECT IDENT_CURRENT은 여러 사용자가 동시에 접속해서 사용하는 시스템은 값을 절대 보장할 수 없기 때문에 SCOPE_IDENTITY() 사용을 권장하고 있습니다.
<insert id="createProjectBasicInfo" parameterClass="prjIdx">
INSERT INTO PRJ_INFO (
...
) VALUES (
...
)
<selectKey keyProperty="prj_info_seq" resultClass="int">
SELECT SCOPE_IDENTITY()
</selectKey>
</insert>
하지만 위와같이 처리하면 다음과 같은 exception 발생합니다.
Exception in thread "main" com.ibatis.common.beans.ProbeException:Could not set property 'prj_info_seq' to value 'null' for domain.ProjectInfo. Cause: java.lang.IllegalArgumentException
위 오류를 해결하기 위해 상당수의 시간을 소비하였고 결국은 다음과 같이 해야 문제가 발생하지 않고 올바로 수행한다는 것을 발견했습니다.
<insert id="createProjectBasicInfo" parameterClass="prjIdx">
<selectKey keyProperty="prj_info_seq" resultClass="int">
INSERT INTO PRJ_INFO (
...
) VALUES (
...
)SELECT SCOPE_IDENTITY()
</selectKey>
</insert>
위에서 처럼 'SELECT SCOPE_IDENTITY()'를 사용하지 않고 'SELECT IDENT_CURRENT('table')'를 사용한다면 최상단의 로직으로 수행해도 잘 수행이 됩니다. 하지만 SELECT IDENT_CURRENT은 여러 사용자가 동시에 접속해서 사용하는 시스템은 값을 절대 보장할 수 없기 때문에 SCOPE_IDENTITY() 사용을 권장하고 있습니다.