인프런 커뮤니티 질문&답변
@Id 기본키 관련 질문입니다.
작성
·
224
0
1. 우선 예시로, 일반적으로 통화코드 관련 테이블을 만든다고 생각할 경우,
아래처럼 만들텐데요,
- 통화코드((ex) USD)
- 설명
- 소수점자리수
이런 테이블의 경우에도 보통 @Id 를 별도로 통해 기본키를 잡으시나요?
2. 만약 위 테이블에서 문자열 통화코드를 기본키로 잡고자 한다면 어떻게 해야 할까요?
아래처럼 세팅하니
@Entity
@Getter @ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Table(name = "CURRENCYTYPE")
public class CurrencyType {
@Id
@Column(length = 3)
private String currency;
private String description;
@Column(length = 1, nullable = false)
@ColumnDefault("0")
private Integer decimalPoint;
}
테스트 시점에 저장된 엔티티와 조회한 엔티티가 서로 다르다고 나오네요..
public void findById() {
CurrencyType currencyType = CurrencyType.builder()
.currency("USD")
.description("Canadian dollar")
.decimalPoint(2)
.build();
currencyTypeRepository.save(currencyType);
Optional<CurrencyType> findCurrencyType = currencyTypeRepository.findById(currencyType.getCurrency());
assertThat(findCurrencyType.get()).isEqualTo(currencyType);
}
Expecting: <"CurrencyType(currency=USD, description=Canadian dollar, decimalPoint=2) (CurrencyType@50143c10)"> to be equal to: <"CurrencyType(currency=USD, description=Canadian dollar, decimalPoint=2) (CurrencyType@1a0e3bcd)"> but was not.
답변 1
0
김영한
지식공유자
안녕하세요. HappyJay님
1. 코드가 명확하고 PK 조건을 완전히 만족하고, 미래에도 변하지 않는다면 코드를 @Id로 잡으셔도 됩니다.
2. 트랜잭션 범위가 같아야 같은 영속성 컨텍스트에서 저정하고 조회합니다. 테스트 코드에 트랜잭션을 걸어주세요.
감사합니다.





