그리고 @id가 그냥 키라는 의미이고 하이버네이트에서 자종으로 생성해준다는 뜻이 아닌건가요? @id하고 @generatevalue가 같이 쓰여야 insert할 때 겂이 자동할당되는것인가요?
-> @Id는 PK를 매핑한다는 뜻이고, @GenerateValue는 키 생성 전략을 의미합니다. 기본적으로 같이 쓰여야 자동할당이 됩니다. 자세한 내용은 섹션4. 엔티티 매핑을 참고해주세요^^
감사합니다.
해결된 질문
작성
·
332
답변 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
1
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
제가 질문을 잘못 드린거 같습니다
Team에서 id와 teamcode_id가 있는데 전 teamcode_id로 매칭하고 싶습니다. id는 insert하면 자동으로 생성되는 값이고, teamcode_id는 제가 작접 넣으려는 값입니다.
그리고 @id가 그냥 키라는 의미이고 하이버네이트에서 자종으로 생성해준다는 뜻이 아닌건가요? @id하고 @generatevalue가 같이 쓰여야 insert할 때 겂이 자동할당되는것인가요?