inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

기존 시퀀스를 사용할 경우

194

lkorea12

작성한 질문수 2

0

=========================================
[질문 템플릿]
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 외에는 방법이 없는것인지 질문드립니다.
 
 
 
 

JPA java

답변 1

0

김영한

안녕하세요. lkorea12님

"A 개발자가 미리 만들어 놓은 시퀀스는 시퀀스에 비즈니스 로직인 (짝수여야 한다) 라는 컨셉"을 유지하려면 시퀀스를 직접 조회하는 쿼리로 불러온 다음에 JPA가 제공하는 시퀀스 전략을 포기하고, id 값에 해당 시퀀스 결과를 직접 넣어주어야 할 것 같아요.

감사합니다.

0

lkorea12

감사합니다

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

58

2

inheritance startegy 선택시 고려사항

0

42

1

Entity 동등성 비교

0

47

1

실무 조언 관련 질문입니다.

0

68

1

H2데이터베이스 파일 생성

0

78

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

70

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

63

1

JPQL 메소드와 락

0

63

1

Delivery @OneToOne

0

73

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

105

2

UnsupportedOperationException 발생

0

97

3

H2 Database 연결이 안됩니다.

0

103

2

연관관계 매핑 질문드립니다.

0

95

2

h2데이터베이스 실행오류

0

116

2

persistence.xml

0

121

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

90

1

영속성 컨텍스트

0

77

1

JPA 프록시

0

107

1

Native Query와 MyBatis

0

83

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

97

1

임베디드 타입 예시 코드 관련 질문

0

126

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

103

3

인텔리제이 패키지 커서 단축키 질문

0

113

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

156

1