Trình tạo mã định danh mặc định cho Postgresql trong Hibernate là SequenceGenerator [1]. tức là Hibernate sẽ làm SELECT nextval('hibernate_sequence')
để tạo ID trước khi thực hiện một cam kết phiên INSERT foo (id, ...) VALUES (123, ...)
. Tuy nhiên, PostgreSql hỗ trợ các cột id tự động (xem ví dụ [2]), và trình tạo mặc định cho tất cả các cơ sở dữ liệu khác hỗ trợ autoincrement là sử dụng tính năng đó [3], và thực hiện chèn bỏ giá trị id và truy vấn cơ sở dữ liệu cho id mới (trước cam kết phiên, nhưng trong giao dịch của phiên).Tại sao trình tạo mặc định Hibernate cho PostgreSql là "SequenceGenerator" chứ không phải "IdentityGenerator"?
Tôi đã thấy một số cuộc thảo luận gần đây [4] gợi ý rằng chiến lược trước đây tốt hơn nói chung, do sự không khớp trước đó của phiên chèn trước.
Nếu Trình tự tạo luồng là tốt hơn (theo [4]), tại sao nó không phải là mặc định cho các cơ sở dữ liệu hỗ trợ nó (xem [3])?
Nếu IdentityGenerator tốt hơn, tại sao PostgreSql lại chọn SequenceGenerator một cách rõ ràng khi Postgres hỗ trợ cũ (theo [2])?
Tôi đã cố gắng tìm lịch sử của quyết định ghi đè lên mặc định trong phương ngữ Postgres (xem [1]), nhưng tôi không thể tìm thấy cam kết có liên quan trong GitHub. Tôi đã theo mã trở lại kho lưu trữ SVN, nhưng dấu vết đi vào nơi mà tệp PostgreSQLDialect được thêm vào tại r11563 với một thông báo cam kết vô ích về "di chuyển maven" [5]. Tôi dường như không thể theo lịch sử nữa. Bất cứ ai có thể tìm thấy cam kết mà thêm ghi đè này? Có lẽ có nhiều thông tin hơn trong thông điệp cam kết.
Xin cảm ơn trước.
[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx
Tôi giả định điều này là do kiểu dữ liệu 'nối tiếp' chỉ là một" chuỗi trong ngụy trang ". –
Điều đó không giải thích được - tất cả các cột tự động là các chuỗi trong ngụy trang. – Rich
không, không phải cho SQL Server hoặc MySQL, nơi bạn không thể nhận được giá trị tiếp theo mà không thực hiện việc chèn (đó là sự khác biệt lớn giữa giải pháp dựa trên chuỗi và "tự động tăng") –