inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

단방향 연관관계

관계에 대해 질문드립니다

해결된 질문

377

kim

작성한 질문수 43

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로 자동생성도 가능하게 할 수 있나요?

java JPA

답변 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

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

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

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

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

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

inheritance startegy 선택시 고려사항

0

3

0

Entity 동등성 비교

0

12

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

91

3

인텔리제이 패키지 커서 단축키 질문

0

106

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

136

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1