Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

잡동사니를 모아두는 서랍장

JPA 기본키 자동 생성 방법 선택하기 본문

SQL, JPA

JPA 기본키 자동 생성 방법 선택하기

kingkk31 2020. 2. 2. 13:23

@GeneratedValue strategy 속성에 명시(ex : @GeneratedValue(strategy = GenerationType.IDENTITY))

  • IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 방법 (데이터베이스에 의존적)
    -
    주로 MySQL, PostgresSQL, SQL Server, DB2에서 사용.
    -
    예를 들어, mysql auto_increment를 사용하여 기본키 생성.
  • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 (데이터베이스에 의존적)
    - 주로 시퀀스를 지원하는 Oracle, PostgresSQL, DB2, H2에서 사용.
    - @SequenceGenerator를 사용하여 시퀀스 생성기를 등록하고, 실제 데이터베이스의 생성될 시퀀스이름을 지정해줘야 함.
  • TABLE : 키 생성 테이블을 사용하는 방법
    - 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만드는 방법.
    - 테이블을 사용하므로, 데이터베이스 벤더에 상관없이 모든 데이터베이스에 적용이 가능.
  • AUTO : 데이터베이스 벤더에 의존하지 않고, 데이터베이스는 기본키를 할당하는 방법
    - 데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE 방법 중 하나를 자동으로 선택해주는 방법.
    - 예를 들어 Oracle일 경우 SEQUENCE를 자동으로 선택해서 사용. 따라서데이터베이스를 변경해도 코드를 수정할 필요 X.

 

부록) - 이걸 어쩌다 조사하게 됬냐면...

  • 기본키 생성 전략이 table일 거라 생각하고 테이블의 entity strategy auto에서 identity로 지정했는데 결과가 동일했다. 쿼리를 찍어보니 쿼리도 동일.
  • Hibernate 버전은 5.2.4.Final 이었다. Hibernate 5 부터는 auto table을 사용한다는 얘기를 들은적이 있어서 그런줄 알았는데 테스트시에 identity로 동작하고 있었음.
  • 원인은 스프링 부트 버전 때문에...Spring Boot의 JpaProperties를 보면 useNewIdGeneratorMappings 가 있는데, 이 값이 true이면 Hibernate의 id 생성 전략을 따르고 false 이면 따르지 않음.
  • 근데 문제는 1.5 에선 false, 2.0 부터는 true가 default 다.
  • 그러니 Hibernate 5.x.x 버전을 사용하더라도 MY-SQL을 사용중이니 identity로 지정되는 것이었다.
  • 자세한건 참고 링크 중 세번째를 확인하자...

 

 

참고)

Comments