@GeneratedValue는 @Id와 함께 쓰는 어노테이션이며 auto_increment와 같은 자동 생성 전략을 결정합니다.

 

JPA에서 복합키를 구현하기 위한 IdClass와 EmbeddedId를 복습하던 도중 @GeneratedValue도 함께 사용해보았습니다.

 

IdClass 사용

우선 Primary Key를 위한 UserId 클래스를 생성합니다.

 

그리고 User Entity를 생성합니다.

클래스선언 위에 @IdClass를 사용해줍니다.

 

이제 DB가 만들어지는지 실행을 해볼까요?

음~ 잘 만들어졌네요!

 

이제 User table에 데이터를 넣어봅시다.

데이터를 넣기 위해 Test를 작성하였습니다.

User 테이블은 auto_increment이므로 id는 1이됩니다.

 

하지만 에러가 떠버립니다.

 

 

EmbeddedId 사용

다음은 Embeddable 입니다.

우선 Primary Key를 위한 UserId 클래스를 생성합니다.

 

그리고 User Entity입니다.

PK 위에 @EmbeddedId를 사용합니다.

 

이번에는 auto_increment조차 생기지 않습니다.

다른 방법들도 시도해보았으나 모두 실패했습니다 ㅠ

 

 

결론

사실 제가 코드를 잘못 짠줄 알고 구글링을 여러번 시도했습니다.

https://infondgndg91.blogspot.com/2019/11/hibernate-composite-identifiers.html

 

Hibernate - Composite Identifiers @EmbeddedId @IdClass With @GeneratedValue is impossible

ndgndg91

infondgndg91.blogspot.com

그러던 중 이 블로그를 발견하였고, 이분도 어떤 커뮤니티에서 물어보셨던 것인지

@GeneratedValue를 @IdClass, @EmbeddedId와 함께 사용하는 것이 불가능하다는 답변을 받은것 같습니다.

 

앞으로 주의해서 사용해야 할 것 같습니다.

복합 키를 구현하기 위해 @Id 어노테이션을 두개 사용했더니 에러가 발생했습니다 ㅠ

 

구글링 하다가 @Id를 한 클래스에 두개를 쓰면 안된다는 것을 알게되었고 복합 키 구현 방법을 찾아다녔습니다.

 

일단 복합 키 구현에는 두 가지 방법이 있습니다.

  1. IdClass 어노테이션 이용
  2. Embeddable 어노테이션 이용

저는 이 글에서 IdClass 어노테이션 적용'만' 다룰 것입니다.

(Embeddable은 몰라서 그래요.. 공부해서 포스팅 해보겠습니다...)

 

 

우선 @IdClass를 적용하기 위해 Id전용 클래스를 생성합니다.

저는 FollowId 클래스를 생성하였습니다.

 

그 다음 Entity 클래스에서 IdClass 어노테이션을 추가해서 작성해둔 Id전용 클래스를 적어두면 끝입니다!

 

여기서 주의할 점은

User 클래스에서 작성한 mappedBy의 이름과 Follow의 변수명, FollowId의 변수명

이 세가지가 모두 같아야합니다!

'Spring' 카테고리의 다른 글

Entity @GeneratedValue with @IdClass, @EmbeddedId  (2) 2021.08.06
Entity @Embeddable을 이용한 복합 키 구현  (0) 2021.08.01
Spring @RequestParam String[] 문제  (0) 2021.07.24
Spring JPA Pagenation  (0) 2021.07.24
Spring Optional.isPresent()  (0) 2021.07.15

+ Recent posts