거꾸로 토마토

MS-SQL서버를 iBatis와 사용할 때 <selectKey>사용시 유의사항 본문

Programming/iBatis

MS-SQL서버를 iBatis와 사용할 때 <selectKey>사용시 유의사항

otamot 2011. 7. 21. 18:05
MS-SQL 서버를 iBatis를 사용할 때 insert처리하고 바로 identity값을 얻고자할 때 <selectKey>태그를 이용합니다. 이 때 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() 사용을 권장하고 있습니다. 


 
3 Comments
댓글쓰기 폼