휴지 상태, @SequenceGenerator 및 allocationSize
할 때 은 Hibernate입니다.@SequenceGenerator
- 실제 데이터베이스 시퀀스를 1씩 증가시키고, 이 값을 50으로 곱합니다(기본값).allocationSize
value) - 이 IDvalue)로합니다.- 「 ID 」 。
이는 잘못된 동작이며 다음과 같은 사양과 충돌합니다.
allocation Size - (옵션)시퀀스에서 시퀀스 번호를 할당할 때 증가하는 양.
명확히 하자면:생성된 아이디 간의 간격은 신경 쓰지 않습니다.
기본 데이터베이스 시퀀스와 일치하지 않는 ID에 관심이 있습니다.예를 들어, 다른 응용 프로그램(예를 들어 플레인 JDBC 사용)은 시퀀스에서 얻은 ID 아래에 새 행을 삽입하고 싶을 수 있습니다. 그러나 이러한 모든 값은 이미 Hibernate에서 사용되고 있을 수 있습니다.광기.
에 대한 있는 사람이 (「」를 설정하지 ).allocationSize=1
포먼 를저 ?하 저? ???
★★★★★★
확실히 하기 위해서.= " " " " " " " ID = " " " " 。1
는 값인 HB를 51, 52, 53...
엔티티 은 ""로 됩니다.2
다른 애플리케이션이 이 시퀀스를 사용하고 있는 경우는, 에러가 발생하기 쉽습니다.
는 ( 편: (내내내내가 should should should should should should should should should should should ( ( ( ( ( ( ( ( ( ( ( ( on on on on on on on on on on on on on on on on on on on on on on on on on on ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( on)로 되어 있습니다51
는 HB 범위 내의 .2, 3 ... 50
★★★★★★★
Steve 에 언급했듯이,많은 가장 직관적인 행동)은 Steve Eversole을 할 수 .hibernate.id.new_generator_mappings=true
.
여러분 모두 감사합니다.
2 데: 2 :
향후 독자를 위해 아래에서 작업 예를 찾을 수 있습니다.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
확실히 말씀드리면...설명하신 내용은 사양과 전혀 상충되지 않습니다.이 사양에서는 데이터베이스 시퀀스에 실제로 저장되어 있는 값이 아니라 휴지 상태가 엔티티에 할당되어 있는 값에 대해 설명합니다.
그러나 원하는 동작을 얻을 수 있는 옵션이 있습니다.먼저 "JPA 주석과 휴지 상태를 사용하여 동적으로 @GeneratedValue 전략을 선택할 수 있는 방법이 있습니까?"에 대한 답변을 참조하십시오.그것이 당신에게 기본이 될 것입니다.SequenceStyleGenerator 를 사용하도록 설정되어 있는 한, 휴지 상태에서는, 다음과 같이 해석됩니다.allocationSize
Sequence Style Generator 풀 、 " 링된 sequence sequence sequence sequence sequence sequence sequence sequence sequence sequence sequence sequence 。"풀링된 최적화 도구"는 시퀀스 작성에 대한 "증분" 옵션을 허용하는 데이터베이스와 함께 사용됩니다(시퀀스를 지원하는 모든 데이터베이스가 증분을 지원하는 것은 아닙니다).어쨌든, 거기서 다양한 옵티마이저 전략에 대해 읽어보세요.
allocationSize=1
쿼리 Hibernate가 allocationSize 범위의 값을 할당하기 전에 마이크로 최적화되므로 시퀀스에 대한 데이터베이스 쿼리를 피하도록 합니다.그러나 이 쿼리는 1로 설정하면 매번 실행됩니다. 하고 그 사이에 다른 어플리케이션에서 되고 있는 , 에, 은 거의 차이가 .
차세대 시퀀스 ID는 allocation Size를 기반으로 합니다.
디폴트에서는, 다음과 같이 보관됩니다.50
그건 너무 심해요., ,, 분, 분, 분, 분, 분, 분, 분, 분, 분, 분, 분, 분, 분, about, about, about, about, about, about, about, about, about, about about, about, , ,50
1개의 세션에서 유지되지 않고 이 세션과 변환을 사용하여 유지되는 레코드입니다.
항상 이렇게 요.allocationSize=1
「」를 사용하여SequenceGenerator
에서는 시퀀스가 1
스키마 내의 시퀀스는 DDL에서 확인하겠습니다.JPA 구현은 올바른 할당 크기를 가진 시퀀스 작성만 담당합니다.따라서 할당 크기가 50인 경우 시퀀스의 DDL에 50의 증분이 있어야 합니다.
이 경우는 일반적으로 할당 사이즈가 1인 시퀀스를 작성한 후 나중에 할당 사이즈가 50(또는 디폴트)으로 설정했을 때 발생할 수 있지만 시퀀스 DDL은 갱신되지 않습니다.
멤버들
갭이 큰 아이디(기본값 50)의 이유를 설명해 주시겠습니까?4.2.15 동면, org.hibernate.id.15 동면.옵티마이저 팩토리 캐스
if ( lo > maxLo ) {
lastSourceValue = callback.getNextValue();
lo = lastSourceValue.eq( 0 ) ? 1 : 0;
hi = lastSourceValue.copy().multiplyBy( maxLo+1 );
}
value = hi.copy().add( lo++ );
.따라서 서버 재시작 빈도가 높은 테스트 중 내 ID는 다음 시퀀스 ID를 생성합니다.
2, 4, 251, 850,1, 2, 3, 4, 19, 250, 251, 252, 400, 550, 750, 751, 850, 1100, 1150.
스펙과 상충되지 않는다고 이미 말씀하셨지만, 대부분의 개발자들에게는 매우 예상치 못한 상황이 될 것이라고 생각합니다.
아무나 입력해 주시면 감사하겠습니다.
지환
ne1410s: ne1410s: ne1410s.
cfrick: 네.그렇게 하겠습니다.첫 게시물이라 사용법을 잘 몰랐어요.
이제 max Lo가 두 가지 용도로 사용되는 이유를 더 잘 이해할 수 있게 되었습니다.휴지 상태에서는 DB 시퀀스를 한 번 호출하고 Java 레벨에서 id를 늘린 후 DB에 저장하므로 Java 레벨 id 값은 다음 번에 시퀀스를 호출할 때 DB 시퀀스를 호출하지 않고 변경된 양을 고려해야 합니다.
예를 들어 시퀀스 ID는 한 지점에서 1이고 최대 절전 모드는 5, 6, 7, 8, 9로 입력되었습니다(allocationSize = 5).다음 번에 다음 시퀀스 번호를 얻으면 DB는 2를 반환하지만 최대 절전 모드는 10, 11, 12를 사용해야 합니다.따라서 "hi = lastSourceValue.copy().multiplyBy(maxLo+1)"를 사용하여 DB 시퀀스에서 반환된 2에서 다음 ID 10을 가져옵니다.서버 재기동을 자주 했을 때에만 신경이 쓰였던 것 같습니다만, 이것은 큰 공백으로 인한 저의 문제였습니다.
따라서 SEQUENCE ID를 사용하면 테이블에 삽입된 ID가 DB의 SEQUENCE 번호와 일치하지 않습니다.
휴지 상태 소스 코드와 아래 구성을 파헤친 후 50개의 삽입 후 다음 값을 위해 Oracle db로 이동합니다.따라서 INST_PK_SEQ가 호출될 때마다 50씩 증가합니다.
휴지 상태 5는 아래 전략에 사용됩니다.
아래 http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-sequence도 확인해 주세요.
@Id
@Column(name = "ID")
@GenericGenerator(name = "INST_PK_SEQ",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@org.hibernate.annotations.Parameter(
name = "optimizer", value = "pooled-lo"),
@org.hibernate.annotations.Parameter(
name = "initial_value", value = "1"),
@org.hibernate.annotations.Parameter(
name = "increment_size", value = "50"),
@org.hibernate.annotations.Parameter(
name = SequenceStyleGenerator.SEQUENCE_PARAM, value = "INST_PK_SEQ"),
}
)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "INST_PK_SEQ")
private Long id;
저도 하이버네이트5에서 이 문제에 직면했습니다.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
다음과 같은 경고가 표시됩니다.
사용되지 않는 [org.hibernate.id]의 사용을 발견했습니다.SequenceHiLoGenerator]시퀀스 기반 ID 생성기.org.hibernate.id.generator 를 사용합니다.대신 Sequence Style Generator를 사용합니다.자세한 내용은 휴지 상태 도메인 모델 매핑 가이드를 참조하십시오.
그런 다음 SequenceStyleGenerator로 코드를 변경했습니다.
@Id
@GenericGenerator(name="cmrSeq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "SEQUENCE")}
)
@GeneratedValue(generator = "sequence_name")
private Long titId;
이것으로 두 가지 문제가 해결되었습니다.
- 폐지된 경고가 수정되었습니다.
- 이제 id가 oracle 시퀀스에 따라 생성됩니다.
언급URL : https://stackoverflow.com/questions/12745751/hibernate-sequencegenerator-and-allocationsize
'programing' 카테고리의 다른 글
foreach는 php의 배열 순서로 반복할 수 있습니까? (0) | 2022.09.19 |
---|---|
어떻게 하면 발의 감지를 개선할 수 있을까요? (0) | 2022.09.19 |
Maria DB에서 외부 키를 삭제할 수 없습니다. (0) | 2022.09.18 |
같은 테이블의 한 열에서 다른 열로 값 복사 (0) | 2022.09.18 |
JavaScript ES6 클래스의 개인 속성 (0) | 2022.09.18 |