Tất cả chúng ta đều biết hành vi mặc định của Hibernate khi sử dụng @SequenceGenerator
- nó tăng chuỗi cơ sở dữ liệu thực lên một , nhân giá trị này lên 50 ( allocationSize
giá trị mặc định ) - và sau đó sử dụng giá trị này làm ID thực thể.
Đây là hành vi không chính xác và xung đột với thông số kỹ thuật cho biết:
DeliverySize - (Tùy chọn) Số lượng tăng lên khi phân bổ số thứ tự từ trình tự.
Nói rõ hơn: Tôi không bận tâm về khoảng cách giữa các ID được tạo.
Tôi quan tâm đến các ID không nhất quán với chuỗi cơ sở dữ liệu bên dưới. Ví dụ: bất kỳ ứng dụng nào khác (ví dụ: sử dụng JDBC thuần túy) có thể muốn chèn các hàng mới dưới ID thu được từ trình tự - nhưng tất cả các giá trị đó có thể đã được Hibernate sử dụng! Điên cuồng.
Có ai biết giải pháp nào cho vấn đề này (mà không cần thiết lập allocationSize=1
và do đó làm giảm hiệu suất) không?
CHỈNH SỬA:
Để làm cho mọi thứ rõ ràng. Nếu bản ghi được chèn lần cuối có ID = 1
, thì HB sử dụng các giá trị 51, 52, 53...
cho các thực thể mới của nó NHƯNG đồng thời: giá trị của chuỗi trong cơ sở dữ liệu sẽ được đặt thành 2
. Điều này có thể dễ dàng dẫn đến lỗi khi các ứng dụng khác đang sử dụng trình tự đó.
Mặt khác: đặc tả cho biết (theo hiểu biết của tôi) rằng chuỗi cơ sở dữ liệu nên được đặt thành 51
và trong thời gian chờ đợi HB nên sử dụng các giá trị từ phạm vi 2, 3 ... 50
CẬP NHẬT:
Như Steve Ebersole đã đề cập bên dưới: hành vi được mô tả bởi tôi (và cũng là trực quan nhất đối với nhiều người) có thể được kích hoạt bằng cách cài đặt hibernate.id.new_generator_mappings=true
.
Cảm ơn tất cả các bạn.
CẬP NHẬT 2:
Đối với những độc giả trong tương lai, bạn có thể tìm thấy một ví dụ hoạt động bên dưới.
@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;
}
Persence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
save
nhu cầu truy vấn cơ sở dữ liệu cho giá trị tiếp theo của chuỗi.
SequenceGenerator
Hibernate sẽ chỉ truy vấn cơ sở dữ liệu khi hết số lượng ID được chỉ định bởi allocationsize
. Nếu bạn thiết lập allocationSize = 1
thì đó là lý do tại sao Hibernate truy vấn DB cho mỗi lần chèn. Thay đổi giá trị này, và bạn đã hoàn tất.
hibernate.id.new_generator_mappings
thiết lập thực sự quan trọng. Tôi hy vọng đó là cài đặt mặc định mà tôi không phải mất quá nhiều thời gian để nghiên cứu lý do tại sao số id trở nên lung tung.