우리는 모두 Hibernate를 사용할 때의 기본 동작을 알고 있습니다. @SequenceGenerator
실제 데이터베이스 시퀀스를 1 씩 증가시키고이 값을 50 (기본값 allocationSize
) 으로 곱한 다음이 값을 엔티티 ID로 사용합니다.
이것은 잘못된 동작이며 다음과 같은 사양 과 충돌합니다 .
assignmentSize-(선택 사항) 시퀀스에서 시퀀스 번호를 할당 할 때 증가 할 양입니다.
명확하게 말하면 생성 된 ID 간의 간격에 대해서는 신경 쓰지 않습니다.
기본 데이터베이스 시퀀스와 일치하지 않는 ID에 관심이 있습니다 . 예를 들어 : 다른 애플리케이션 (예 : 일반 JDBC 사용)은 시퀀스에서 얻은 ID 아래에 새 행을 삽입하려고 할 수 있습니다. 그러나 모든 값은 이미 Hibernate에서 사용하고있을 수 있습니다! 광기.
누군가이 문제에 대한 해결책을 알고 allocationSize=1
있습니까 (설정하지 않고 성능을 저하 시키지 않음 )?
편집 :
일을 명확하게하기 위해. 마지막으로 삽입 된 레코드의 ID = 1
이면 HB 51, 52, 53...
는 새 엔티티에 대한 값 을 사용 하지만 동시에 데이터베이스의 시퀀스 값은로 설정됩니다 2
. 다른 응용 프로그램에서 해당 시퀀스를 사용할 때 쉽게 오류가 발생할 수 있습니다.
반면에 : 사양은 (내 이해에서) 데이터베이스 시퀀스가 설정 51
되어야하며 그 동안 HB는 범위의 값을 사용해야 한다고 말합니다.2, 3 ... 50
업데이트 :
Steve Ebersole이 아래에 언급했듯이 : 나에 의해 설명 된 동작 (그리고 많은 사람들에게 가장 직관적 인 동작)은를 설정하여 활성화 할 수 있습니다 hibernate.id.new_generator_mappings=true
.
감사합니다.
업데이트 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>
save
사람들이 시퀀스의 다음 값에 대해 데이터베이스를 쿼리해야하기 때문 입니다.
SequenceGenerator
Hibernate를 사용하면 지정된 양의 ID가 부족할 때만 데이터베이스를 쿼리합니다 allocationsize
. 설정하면 allocationSize = 1
Hibernate가 각 삽입에 대해 DB를 쿼리하는 이유입니다. 이 값을 변경하면 완료됩니다.
hibernate.id.new_generator_mappings
설정은 정말 중요합니다. ID 번호가 왜 야생인지 조사하는 데 많은 시간을 할애하지 않아도되는 기본 설정이 되었으면합니다.