엔티티 기본맵핑에 대해 자세히 알아보자
내가 몰랐던 내용이나 좀더 중요한 내용을 중점으로 정리를 했다.
쭉보면 create 같은건 정말 위험한 명령어이다.. 수정/삭제를 프로그램이 자동으로 할수 없게 따로 분리시키는게 좋을것 같다.(아예 안쓰던가)
create , create-drop , update 는 운영장비에는 절대로 사용하면 안된다!
enumerated 에는 STRING 과 ORDINAL(default) 이 있다.
STRING 은 enum 이름을 데이터베이스에 저장하고 ORDINAL 은 enum 순서를 데이터베이스에 저장
STRING 을 쓰자 왜냐하면 ORDINAL로 해버리면 옜날 데이터 까지 순서가 그대로여서 새로 넣은 데이터와 순서가 꼬여버린다.
[ A(0) B(1) ] -> 데이터추가 [C(0) A(0) B(1) ]
총 4가지 strategy가 있다.
AUTO/IDENTITY/SEQUENCE/TABLE
- Auto = db 방언에 따라 자동지정
- IDENTITY = 데이터베이스에 위임한다. (데이터베이스가 알아서 하게)
- SEQUENCE = DB시퀀스 오브젝트사용, ORACLE @SequenceGenerator 필요하다
- TABLE = 키생성용 테이블 사용 @TableGenerator 필요하다
AUTO-INCREMENT 는 DB에 쿼리문을 날려야 ID값을 알수있다. -> ID값이 있어야 persist() 를 해서 영속성컨텍스트에 넣을수 있기 때문에 persist() 하는 즉시 INSERT SQL 쿼리문이 날라가 실행 된다. 그래야 id값을 알고 영속성 컨텍스트에 넣을수 있기 때문!!!
영속성 컨텍스트에 넣을려면 id값 필요!
persist()를 해서 영속성 컨텍스트에 넣을떄는 pk값이 필요한데 sequence는 db에서 pk값을 가져와야하므로 쿼리를 날려 먼저 가져온다.
commit 하기전에는 db에 쿼리를 날리는게 아니므로 그전까지는 영속성 컨텍스트에 있다.
allocationSize() 는 쉽게말해 한번에 키값을 많이가져와 메모리상에 올려두고 사용하는 방식이다. (한번에 많이부르고 왔다갔다를 최소화 하는 방법)
-> 이걸 쓰는 이유는 persist를 한뒤 pk값이 없으면 DB에 쿼리문을 날리고 다시가져오고 Commit 해서 db에 적용하고..... 가 너무 비효율적이라 한번에 pk값을 떙겨쓰는것이다.
-> sequence는 키값을 얻으려 db에 쿼리문을 보내 얻어온뒤 persist로 컨텍스트에 넣고 commit으로 db에 넣는다. 이런 과정이 반복되면 성능 저하를 유발한다. 이떄 allocationSize() 를 사용한다.
- 영속성 컨텍스트에 넣기위해 pk값이 필요하다 그래서 identity 는persist 시점에 insert쿼리문이 날라가지만 sequence는 위에 방식으로 모아놨다가 한방에 commit으로 db에 쿼리문을 날릴수 있다.
AutoIncrement or sequence 둘중 하나 선택해야 하지만 이건 둘다 적용 가능하다
하지만 sequence 처럼 최적화가 되지 않은 상태라 성능이 좀 떨어진다는 문제가 있다.
이 방법은 잘 사용되지 않는다..참고만 하자