해결된 질문
작성
·
3K
0
안녕하세요 영한님
오랜만에 질문드립니다
실무 레거시 코드에 JPA를 적용하려던 중 궁금한점이 생겨서 질문드립니다
기존 테이블의 PK가 컬럼 2개를 하나의 쌍으로 가진 composite 형태입니다
그래서 @IdClass를 이용한 매핑을 하였는데 문제는 select 후 PK로 사용하는 컬럼 중 하나의 값을 변경해서 Dirty Check 과정으로 업데이트를 하려고 하면 identifier of an instance of ... was altered from 메세지가 나오면서 에러가 납니다
메세지 내용과 Hibernate 1차 캐시의 개념을 생각해 본다면 어느 정도 이해가 가기는 하는데 혹시 composite 형태의 PK 필드 중 특정 필드만 변경해서 업데이트를 하는 것이 가능한가요?
답변 2
3
안녕하세요 jhwoo님
사실 PK의 값을 update 해야 한다는 것이 잘 이해가 안됩니다.
JPA를 떠나서, 관계형 데이터베이스에서 PK 제약조건의 값은 변경하면 안됩니다.
JPA는 이런 기본 전제를 기반으로 설계되었기 때문에, PK의 값을 변경하는 행위는 금지되어 있습니다.
변경할 수 있다는 것은 이미 PK가 아니고, 데이터베이스 테이블의 설계가 잘못된 것입니다.
이 경우 데이터베이스 테이블을 다음과 같이 변경하는 것을 권장드립니다.
기존
A1(PK)
A2(PK)
변경
ID(PK)
A1
A2
이렇게 별도의 ID를 만들고, MySQL이라면 auto increment 전략을 사용하면 됩니다.
만약에 레거시 테이블을 변경할 수 없고, 꼭 PK의 값을 변경해야 한다면, 이 UPDATE 쿼리만 JPA를 사용하지 말고, 별도로 JdbcTemplate나 JDBC 등을 사용해서 처리하시면 됩니다.
감사합니다^^
0
몇가지 테스트를 더 해보니 composite 키가 아니더라도 persist 상태의 ID를 변경하면 동일한 현상이 발생하네요
detach를 한 상태에서는 당연히 새로운 insert가 발생하구요
PK가 1개의 컬럼인 상태에서 PK를 변경하는 요건은 없으나 composite 상태에서 특정 컬럼의 값은 변경해야 되는 요건이 있어 혹시 이에 대한 의견 부탁드립니다