Chiến lược tạo ID rất quan trọng đối với việc chèn hàng loạt trong Hibernate. Đặc biệt, việc tạo IDENTITY thường sẽ không hoạt động (lưu ý rằng AUTO cũng thường ánh xạ tới IDENTITY). Điều này là do trong quá trình chèn hàng loạt, Hibernate có một cờ gọi là "RequiredIm InstantIdAccess" cho biết liệu các ID được tạo có được yêu cầu ngay lập tức hay không; nếu vậy, xử lý hàng loạt bị vô hiệu hóa.
Bạn có thể dễ dàng phát hiện điều này trong nhật ký cấp GỠ LỖI khi nó cho biết "thực hiện chèn danh tính ngay lập tức" - điều này có nghĩa là nó đã bỏ qua quá trình xử lý hàng loạt vì nó được thông báo rằng cần có các ID được tạo ngay sau khi chèn.
Các chiến lược tạo thường làm công việc là TABLE và SEQUENCE, vì Hibernate có thể tạo trước ID, do đó cho phép chèn hàng loạt.
Một cách nhanh chóng để phát hiện xem chèn hàng loạt của bạn có hoạt động hay không là kích hoạt nhật ký cấp GỠ LỖI vì BatchingBatcher sẽ cho bạn biết kích thước lô mà nó đang thực thi ("Đang thực thi kích thước lô:" + batchSize).
Ngoài ra, các thuộc tính sau đây rất quan trọng để đạt được chèn hàng loạt. Tôi không dám nói rằng chúng được yêu cầu vì tôi không đủ chuyên gia Hibernate để làm như vậy - có lẽ đó chỉ là cấu hình cụ thể của tôi - nhưng theo kinh nghiệm của tôi, chúng vẫn cần thiết:
hibernate.order_inserts = true
hibernate.order_updates = true
Các thuộc tính này được ghi chép lại khá kém, nhưng tôi tin rằng những gì chúng đã làm là cho phép các câu lệnh SQL INSERT và UPDATE được nhóm đúng cách để thực thi hàng loạt; Tôi nghĩ rằng đây có thể là chèn nhiều hàng mà bạn đang theo đuổi. Đừng bắn tôi nếu tôi sai về điều này, tôi đang nhớ lại từ trí nhớ.
Tôi cũng sẽ tiếp tục và giả sử rằng bạn đặt thuộc tính sau; nếu không, đây sẽ là một lời nhắc nhở:
hibernate.jdbc.batch_size = xx
Trong đó xx là kích thước lô mong muốn của bạn, tự nhiên.