MS-SQL서버를 iBatis와 사용할 때 <selectKey>사용시 유의사항
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() 사용을 권장하고 있습니다.
'Programming > iBatis' 카테고리의 다른 글
| MS-SQL서버를 iBatis와 사용할 때 <selectKey>사용시 유의사항 (2) | 2011/07/21 |
|---|---|
| iBatis에서 insert후 자동 sequence Key 값을 가져오는 설정 방법 (0) | 2008/02/14 |
| iBatis에서 객체 매핑시 인스턴스 변수명 규칙? (0) | 2008/02/13 |
| 초짜의 iBatis 오류와의 싸움 (1) (0) | 2008/02/01 |
This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from.
CSS
이몽롱
2011/08/22 15:01
이거 없었음 완전 머리 깨질 뻔했습니다
어이 없지만 왜 다른지 모르겠네요.. 하여간 이것때문에 문제를 쉽게 해결해서 기쁩니다.
otamot
2011/09/05 18:50
^^ 도움이돼셨다니 기분 좋네요. 그동안 로그인 암호를 몰라 이제야 댓글을 남깁니다 ^^