=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
hibernate의 ddl 생성 기능을 사용하는것이 아닌, 기존 ddl을 사용한다고 가정할 때,
이미 사용중이던 sequence가 존재할 수 있습니다.
JPA에서 매핑한 엔티티가 기존 시퀀스를 사용한다고 가정할 때, 기존 시퀀스와 매핑하는 방법은 알아보았습니다.
하지만, 기존 시퀀스의 increment Size가 N일 때,
WAS에서 allocationSize을 N과 같이하지 않으면 WAS 기동시 (PersistenceUnit으로부터 emf 생성시) 매핑 이슈가 발생했습니다.
Caused by: org.hibernate.MappingException: The increment size of the [SOMESEQUENCE] sequence is set to [5] in the entity mapping while the associated database sequence increment size is [10].
여기서 SOMESEQUENCE는 제가 임의로 H2에 미리 만들어둔 시퀀스명이며, INCREMENT SIZE는 10 입니다.
그리고 WAS의 설정은 다음과 같습니다.
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "SOMESEQUENCE",
allocationSize = 5
)
둘을 같게하면 사용하는것에 문제는 없으나 질문은 다음과 같습니다.
사내에서 JPA를 사용할 때, 어떤 A 개발자가 미리 시퀀스를 만들어뒀으며, 시퀀스가 2부터 2씩 증가하며, 반드시 이 시퀀스를 사용하는 column은 짝수 이도록 하려고 의도했습니다. (incrementSize = 2)
2 -> 4 -> 6 -> 8 -> ...
allocationSIze가 2일 때, WAS에선 2번에 한번씩만 ID를 얻기위해 DB에 질의를 수행할 테지만,
문제는 2 -> 4 -> 6 -> 8이 아닌, (query)2 -> 3 -> (query)4 - >5 -> (query)6 으로 ID를 세팅 할 것입니다.
이는 기존에 allocationSize를 사용하며 allocationSIze가 50이며 initial Value가 1일 때,
1->2->3 -> was 종료 -> was 재기동 -> 51 -> 52 ...
와 같은 현상에서 중간에 값이 빠지는것과는 다른 문제입니다. 이 경우엔 unique하다는 점은 유지됩니다.
그렇지만 위의 A 개발자가 미리 만들어 놓은 시퀀스는 시퀀스에 비즈니스 로직인 (짝수여야 한다) 라는 컨셉이 allocationSize를 사용하면
유지되지 못합니다.
또한,
allocationSize가 1일때와 그렇지 않을 때가, 다른 양상을 보입니다.
실제 DB의 시퀀스 increment Size가 N일때,
allocationSize는 1또는 N만 매핑되는것을 확인 했습니다.
따라서, N/2나 여타 1 < x < N 인 값들에 대해선 allocationSize에 할당할 수 없으므로,
increment Size와 allocationSize를 정확히 일치시키거나, 1로 설정하여 매번 시퀀스에 질의하는 방법, 이 둘 외에는 allocationSize를 활용할 방법이 없다고 사료됩니다.
따라서 위와 같은 상황 (A 개발자가 미리 만들어둔 시퀀스를 사용해야 하는 상황) 에는 allocationSize = 1 외에는 방법이 없는것인지 질문드립니다.
감사합니다