MyBatis를 이용한 프로젝트에서 객체 하나를 Maria DB에 insert하고 그 키값을 얻어오고 싶었다.
키값은 AUTO_INCREMENT 속성 대신 DB에서 직접 생성한 UUID 값을 사용하기로 하였는데,
<insert> 태그에 추가로 <selectKey> 태그를 넣어주어야 했다.
그래서 아래와 같이 작성했는데
<insert id="insert" parameterType="myCustomType">
<selectKey keyProperty="myObjectId" resutType="myCustomType" order="BEFORE">
SELECT
UUID() as MY_OBJECT_ID
FROM
MY_CUSTOM_TABLE
</selectKey>
INSERT INTO MY_CUSTOM_TABLE (
MY_OBJECT_ID
) VALUES (
#{myObjectId}
);
</insert>
But...
어쩐 일인지 계속 "SelectKey returned no data" 에러만 계속 발생하였다.
테스트해보니 테이블에 데이터가 있을 경우 이 에러는 발생하지 않고
테이블이 비어있는 경우에만 이 에러가 발생하였다.
구글링해보니 남들은 테이블에 값이 있든 없든 잘만 insert되는 거 같은데...
혹시 싶어서 SELECT 문에서 FROM 절을 제거해보았다.
<insert id="insert" parameterType="myCustomType">
<selectKey keyProperty="myObjectId" resutType="myCustomType" order="BEFORE">
SELECT
UUID() as MY_OBJECT_ID
</selectKey>
INSERT INTO MY_CUSTOM_TABLE (
MY_OBJECT_ID
) VALUES (
#{myObjectId}
);
</insert>
엥? 갑자기 너무 잘된다.
DB에 insert할 때 새로 생성된 UUID 값이 잘 저장되고,
insert 구문이 호출된 이후 java 객체에도 UUID값이 잘 담겨져있었다.
결론적으로 "SelectKey returned no data" 에러는 FROM 절을 사용한 게 문제였다.
반응형
'Development Experience > DB' 카테고리의 다른 글
MyBatis 변수명을 잘 썼는데도 There is no getter for property named 오류가 뜬다면.. (1) | 2022.02.28 |
---|