Trước tiên, có một vấn đề nhỏ ở đây: Bạn đang xử lý giá trị của chuỗi giống như chúng có ý nghĩa gì đó. Xem phần cuối của câu trả lời.
Bây giờ, với Hibernate, nó phụ thuộc vào cách người dùng đã định cấu hình ánh xạ. Một cá thể Hibernate được cấu hình tốt sẽ sử dụng các trình tự giống nhau mọi thứ khác.
Thật không may, hầu hết các ánh xạ không phải là rất tốt - hay đúng hơn, tôi nghĩ hành vi mặc định của Hibernate là khủng khiếp và phải luôn bị ghi đè. Trình tự mặc định được sử dụng thực sự là một chia sẻ hibernate_sequence
cho tất cả các bảng. Tuy nhiên, hoàn toàn có thể có một số bảng sử dụng trình tự riêng của chúng và các bảng khác bằng cách sử dụng chia sẻ hibernate_sequence
hoặc để có tất cả các bảng đúng cách sử dụng trình tự của riêng chúng.
Để bật câu trả lời cuối cùng, bạn cần phải đăng ánh xạ của mình.
Nếu (các) bảng bạn muốn thay đổi tạo ID đang sử dụng trình tự chính xác cho các bảng trong ánh xạ Hibernate của chúng, bạn có thể tiếp tục và ALTER SEQUENCE
chuỗi đó. Nếu ánh xạ của bạn qua JPA, điều đó được thực hiện với @SequenceGenerator
và @GeneratedValue
với GenerationType.SEQUENCE
. Nếu nó được thực hiện thông qua orm.xml
, hbm.xml
hoặc chú thích Hibernate kiểu cũ, bạn sẽ cần phải kiểm tra hướng dẫn sử dụng. Hoặc, nếu Hibernate là ứng dụng khách duy nhất ghi vào DB, hãy xem chuỗi để xem liệu chúng có đang sử dụng SELECT * FROM sequence_name
hay không.
Nếu ánh xạ cho (các) bảng quan tâm đang sử dụng chia sẻ hibernate_sequence
, bạn có thể không thực hiện được những gì bạn muốn mà không sửa ánh xạ Hibernate. Bạn cần thay đổi ánh xạ để ánh xạ cho (các) bảng quan tâm sử dụng một trình tự khác, sau đó `LOCK TABLE
và đặt điểm bắt đầu cho các chuỗi đó thành hàng lớn nhất hiện có trong bảng.
Trình tự: Tại sao bạn cần để thay đổi hoặc khởi động lại trình tự? Nó không quan trọng, vì một khóa chính tổng hợp chỉ là một số vô nghĩa mà bạn so sánh cho sự bình đẳng với các số vô nghĩa khác. Bạn đang cố giải quyết vấn đề gì?
Nguồn
2012-08-17 14:48:05
Các ánh xạ được thực hiện với JPA, ví dụ, tất cả các lớp (được ánh xạ tới cơ sở dữ liệu dưới dạng bảng) có "Số nguyên id = -1" được xác định với ánh xạ là "@GeneratedValue (strategy = GenerationType .SEQUENCE) ".Vì chỉ có một chuỗi trong cơ sở dữ liệu (hibernate_sequence) và vì có khoảng cách giữa các giá trị ID trong tất cả các bảng khác nhau, tôi nghĩ rằng an toàn để giả định rằng chuỗi mặc định được chia sẻ giữa tất cả, như bạn đã đề cập. Trình tự cần phải được khởi động lại cho tất cả các bảng đó do tránh một số xung đột trong quá trình chuyển cơ sở dữ liệu. – littleK
Cảm ơn bạn đã giúp đỡ, rất nhiều thông tin. – littleK
@littleK Không sao cả. Hy vọng nó sẽ giúp một chút. Hợp nhất cơ sở dữ liệu ... um ... "vui". Đặc biệt thú vị. Hy vọng bạn đã mua rất nhiều và rất nhiều gin. –