Development Memories/JPA

【JPA】기본 키(Primary Key) 매핑 정리

친절한올드보이 2021. 5. 18. 17:29
반응형

JPA의 기본 키 매핑에 대해서 공부한 내용을 간략히 기록해 봅니다.

(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)

 

JPA가 제공하는 데이터 베이스 기본 키 생성 전략은 아래와 같습니다.

 

  1. 직접 할당
    • 기본 키를 어플리케이션에서 자동으로 직접 할당 한다.
    • em.persist()를 호출하기 전에 어플리케이션에서 직접 식별자 값을 할당해야 한다.
    • 만약 식별자가 없으면 예외가 발생한다.
    • 참조 소스 - 책에 기재되어 있는 예제 소스로 상세한 내용은 별도로 찾아보시길 권장 합니다.
      •  
      • @Id @Column(name = "id") private String id; Baord board = new Board(); board.setId("id1") // 기본 키 직접 할당 em.persist(board);
  2. 자동생성
    • IDENTITY 전략
      • 기본 키 생성을 데이터베이스에 위임한다.
      • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
      • 참고 소스
        • // IDENTITY DDL
          CREATE TABLE BAORD {
          	ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
              DATA VARCHAR(255)
          };
          
          INSERT INTO BOARD(DATA) VALUES('A');
          INSERT INTO BOARD(DATA) VALUES('B');​
           
        • @Entity
          public class Board {
          	@Id
              // MySQL에서 AUTO_INCREMENT로 식별자를 자동 생성하는 경우는
              // 아래와 같이 애노테이션 전략을 설정해 주어야 한다.
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;
              
              
              private static void logic(EntityManager em){
              	Board board = new Board();
                  em.persist(board);
                  System.out.println("board.id = " + board.getId());
              }
              
          }
          
          // 출력 : board.id = 1
          
          
    • SEQUENCE 전략
      • 데이터베이스 시퀀스를 사용해서 기본 키를 할당 한다.
      • 시퀀스를 지원하는 Oracle, PostgreSQL, DB2, H2 데이터 베이스에서 사용할 수 있다.
      • 참고소스
        • //시퀀스 DDL
          CREATE TABLE BOARD {
          	ID BIGINT NOT NULL PRIMARY KEY, 
              DATA VARCHAR(255)
          }
          
          //시퀀스 생성
          CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
        • //시퀀스 매핑 코드
          @Entity
          @SequenceGenerator(
          	name = "BOARD_SEQ_GENERATOR",
              sequenceName = "BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름
              initialValue = 1,
              allocationSize = 1
          	)
          public class Board {
          	@Id
              @GeneratedValue(
              	strategy = GenerationType.SEQUENCE,
              	// 매핑 등록한 시퀀스 생성기를 선택하였으므로
                  // id 식별자 값은 BOARD_SEQ_GENERATOR 시퀀스 생성기가 할당한다. 
                  generator = "BOARD_SEQ_GENERATOR" 
                  	                             
              	)
                  
              private Long id;
          }
          
          
          //시퀀스 사용 코드
          private static void logic(EntityManager em){
          	Board board = new Board();
              em.persist(board);
              System.out.println("board.id = " + board.getId());
          }
          
          
          //출력 : board.id = 1
    • TABLE 전략
      • 키 생성 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 만드는 전략이다.
      • 이 전략은 테이블을 사용하기 때문에 모든 데이터베이스에서 사용할 수 있다.
      • 키 생성 용도로 사용할 테이블 생성이 필요하다.
      • 참고소스
        • // 테이블 생성 DDL
          CREATE TABLE TABLE_SEQUENCE (
          	sequence_name varchar(255) not null,
              next_val bigint,
              primary key (sequence_name)
          )
        • //TABLE 전략 매핑 코드
          @Entity
          @TableGenerator(
          	name = "BOARD_SEQ_GENERATOR",
              table = "TABLE_SEQUENCES", //매핑할 테이블 이름
              pkColumnValue = "BOARD_SEQ",
              allocationSize = 1
          	)
          public class Board {
          	@Id
              @GeneratedValue(
              	strategy = GenerationType.TABLE,
              	// 매핑 등록한 테이블 생성기를 선택하였으므로
                  // id 식별자 값은 BOARD_SEQ_GENERATOR 테이블 생성기가 할당한다. 
                  generator = "BOARD_SEQ_GENERATOR" 
                  	                             
              	)
                  
              private Long id;
          }
          
          
          //시퀀스 사용 코드
          private static void logic(EntityManager em){
          	Board board = new Board();
              em.persist(board);
              System.out.println("board.id = " + board.getId());
          }
          
          
          //출력 : board.id = 1