ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 기본키 저장
    개발/java 2015. 12. 28. 17:17
    1. IDENTITY 전략
    @Entity
    public class Board {
    
    @Id
    @GeneratedValue(strategy GenerationType.IDENTITY)
    private Long id;
    
    }
    

    엔티티가 영속상태가 되려면 식별자가 필요함.

    IDENTITY 전략은 데이터베이스에 저장한 후에 식별자값을 구할수 있으므로 em.persist() 를 호출함과 동시 INSERT SQL이 동작한다.

    트랜잭션을 지원하는 쓰기 지연이 동작하지 않음.


    2. SEQUENCE 전략




    @Entity
    @SequenceGenerator (
    name "BOARD_SEQ_GENERATOR",
    sequenceName " BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름
    initialValue = 1, allocationSize = 1)
    public class Board {
    @Id
    @GeneratedValue(strategy =  GenerationType.SEQUENCE,
                            generator =  "BOARD_SEQ_GENERATOR")
    private Long id;
    
    }
    

    시퀀스전략은 IDENTITY 전략과 다르게 영속화 함과 동시에 INSERT 하지 않는다. (지연 가능)

    단 데이터베이스를 통해 식별자를 조회하는 작업이 필요하다. 2번 통신해야한다.

    JPA는 시퀀스에 접근하는 횟수를 줄이기 위해 allocationSize 를 사용하는데

    50으로 설정해 두면 한번 호출할때 1~50 까지 메모리에서 식별자를 할당하고 51 이 되면 51~100까지를 메모리에서 식별자를 할당한다.


    이 방법은 jvm 이 동시에 동작해도 키값이 충돌하지않는다.



    3. 테이블 전략

    @Entity
    @TableGenerator (
    name =  "BOARD_SEQ_GENERATOR" ’
    table =  "MY_SEQUENCES" ’
    pkColumnValue = "BOARD_SEQ", allocationSize =1)
    public class Board {
    @Id
    @GeneratedValue (strategy = GenerationType.TABLE,
    generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    }
    


    하나의 시퀀스 테이블을 만들고, 구분값에 해당하는 부분이 pkColumnValue 에 해당하는 BOARD_SEQ 가 된다.


     처음에 값이 없어도 JPA 가 INSERT 하면서 1을 넣어준다.




    '개발 > java' 카테고리의 다른 글

    클라이언트 ip (외부ip 가져오기)  (0) 2016.01.25
    jstl escapeXml  (0) 2016.01.19
    JPA update 변경감지  (0) 2015.12.28
    엔티티의 생명주기  (0) 2015.12.28
    EntityManagerFactory와 EntityManager 의 사용  (0) 2015.12.28
Designed by Tistory.