인프런 커뮤니티 질문&답변

kim님의 프로필 이미지
kim

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

단방향 연관관계

관계에 대해 질문드립니다

해결된 질문

작성

·

332

0

Team.               TeamCode

id                         Id

year                     TeamCode_id

teamcode_id.       TeamCode_name

식으로 n:1 관계를 만들고 싶습니다. 

보통 매핑을 id로 하지만

전 team_id로 하고 싶습니다

그럼 이럴때 매핑을 어떻게 해야하나요?

Id는 long타입이라서 제가 원하는 id는 asd123 이렇게 문자형이라서 질문드립니다

그리고 team_id를 abc001 abc002로 자동생성도 가능하게 할 수 있나요?

답변 5

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kim님^^

Team -> TeamCode 사이에 연관관계 참조를 team의 id 대신에 team에 있는 teamcode_id로 하고 싶다는 거지요^^? 그러면 다음과 같이 referencedColumnName을 사용하면 됩니다.

@Entity
public class Team implements Serializable {

    @Id @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "teamcode_id", referencedColumnName = "teamcode_id")
    private TeamCode teamCode;
    ...
}

@Entity
public class TeamCode implements Serializable {

    @Id @GeneratedValue
    private Long id;

    @Column(name = "teamcode_id")
    private String teamCodeId;
    private String teamCodeName;
    ...
}

(참고: referencedColumnName을 사용할 경우 하이버네이트는 Serializable을 인터페이스 상속받아야 합니다.)

그런데 사실 이런 방법은 가능하기는 하지만, 무결점 관점에서 DB 설계상 좋은 방법은 아닙니다. 이렇게 teamcode_id를 여러곳에서 사용하고 싶으면 더 나은 해결방안은

TEAM_CODE 테이블에 PK를 처음부터 Long id를 사용하지 말고 teamcode_id를 PK로 사용하는게 더 나은 선택이라 생각합니다.

TEAM_CODE

teamcode_id (PK)

teamcode_name

이렇게만 유지하는 것이지요.

여기서 한걸음 더 나아가면! (지금부터는 상황에 따라 다릅니다.)

TeamCode 테이블이 정말 꼭 필요한가? 라는 의문도 필요합니다. 우리가 자바로 개발을 하기 때문에, ENUM 타입이라는 좋은 방법이 있습니다. ENUM 타입을 코드로 활용하는 자세한 내용은 다음 블로그 글을 한번 보시는 것도 좋을 것 같아요^^

http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

추가로 질문해주신 내용

그리고 @id가 그냥 키라는 의미이고 하이버네이트에서 자종으로 생성해준다는 뜻이 아닌건가요? @id하고 @generatevalue가 같이 쓰여야 insert할 때 겂이 자동할당되는것인가요?

-> @Id는 PK를 매핑한다는 뜻이고, @GenerateValue는 키 생성 전략을 의미합니다. 기본적으로 같이 쓰여야 자동할당이 됩니다. 자세한 내용은 섹션4. 엔티티 매핑을 참고해주세요^^

감사합니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

kim님 궁금하신게 있으면 언제든지 편하게 질문해주세요^^ 저도 도움이 되어 드려서 기쁘네요 ㅎㅎ 고맙습니다!

1

kim님의 프로필 이미지
kim
질문자

정말 너무 감사합니다^^ 많은 도움이 되었어요

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 kim님

보통 매핑을 id로 하지만 전 team_id로 하고 싶습니다

-> 저는 이 질문을 테이블의 PK 이름이 team_id 인데, 이것을 어떻게 매핑해야 하나로 이해했습니다. 그리고 답변을 드리자면 다음과 같이 @Column을 사용하면 됩니다.

    @Id @Column(name = "team_id")
    private Long id;

Id는 long타입이라서 제가 원하는 id는 asd123 이렇게 문자형이라서 질문드립니다.

-> 문자형이면 다음과 같이 String 타입으로 PK를 매핑하면 됩니다.

    @Id @Column(name = "team_id")
    private String id;

team_id를 abc001 abc002로 자동생성도 가능하게 할 수 있나요?

-> 결론부터 말씀드리면, 자동으로 할 수 있기는 한데, 하이버네이트를 사용해서 복잡한 커스텀한 제네레이터를 직접 만들어야 합니다. 커스텀 제네레이터가 생각보다 복잡해서, 자동생성을 사용하지 말고 abc001을 직접 생성해서 @Id를 수동으로 값을 넣어주는 것이 더 나은 선택일 수 있습니다.

커스텀 제네레이터는 다음을 사이트를 참고해주세요.

https://thoughts-on-java.org/custom-sequence-based-idgenerator/

더 자세한 내용은 섹션4. 엔티티 매핑을 참고해주세요^^

0

kim님의 프로필 이미지
kim
질문자

제가 질문을 잘못 드린거 같습니다

Team에서 id와 teamcode_id가 있는데 전 teamcode_id로 매칭하고 싶습니다. id는 insert하면 자동으로 생성되는 값이고, teamcode_id는 제가 작접 넣으려는 값입니다.

그리고 @id가 그냥 키라는 의미이고 하이버네이트에서 자종으로 생성해준다는 뜻이 아닌건가요? @id하고 @generatevalue가 같이 쓰여야 insert할 때 겂이 자동할당되는것인가요?

kim님의 프로필 이미지
kim

작성한 질문수

질문하기