Composite ID Key 질문 드립니다
안녕하세요 영한님
오랜만에 질문드립니다
실무 레거시 코드에 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 상태에서 특정 컬럼의 값은 변경해야 되는 요건이 있어 혹시 이에 대한 의견 부탁드립니다
Entity 동등성 비교
0
10
1
실무 조언 관련 질문입니다.
0
41
1
H2데이터베이스 파일 생성
0
51
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
48
1
JPQL 메소드와 락
0
52
1
Delivery @OneToOne
0
57
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
89
2
UnsupportedOperationException 발생
0
82
3
H2 Database 연결이 안됩니다.
0
89
2
연관관계 매핑 질문드립니다.
0
82
2
h2데이터베이스 실행오류
0
105
2
persistence.xml
0
103
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
77
1
영속성 컨텍스트
0
62
1
JPA 프록시
0
90
1
Native Query와 MyBatis
0
63
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
83
1
임베디드 타입 예시 코드 관련 질문
0
112
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
90
3
인텔리제이 패키지 커서 단축키 질문
0
106
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
136
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
68
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1





