2012-08-17 35 views
5

Tôi đã được giao nhiệm vụ khởi động lại chuỗi cho nhiều cột nối tiếp khác nhau trong cơ sở dữ liệu PostgreSQL. Thông thường, tôi chỉ đơn giản sử dụng:Làm thế nào để khởi động lại trình tự PostgreSQL được xử lý bởi Hibernate?

ALTER SEQUENCE serial RESTART WITH 105; 

Tuy nhiên, có vẻ như Hibernate đang được sử dụng để xử lý chuỗi cơ sở dữ liệu. Tôi thực sự không biết gì về Hibernate, nhưng sự hiểu biết của tôi là hibernate_sequence là một chuỗi toàn cầu cho tất cả các bảng. Đúng không?

Tôi giả định rằng tôi sẽ cần phải làm như sau, sau đó:

ALTER SEQUENCE hibernate_sequence RESTART WITH 105; 

Nhưng tôi không chắc chắn những gì hậu quả sẽ. Giả sử tôi có các bảng A, B, C và D. Mỗi bảng có một cột ID kiểu nối tiếp. Câu lệnh SQL trên trên hibernate_sequence có khởi động lại cột ID cho TẤT CẢ các bảng không?

Cảm ơn!

Trả lời

4

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@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ì?

+0

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

+0

Cảm ơn bạn đã giúp đỡ, rất nhiều thông tin. – littleK

+1

@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. –

Các vấn đề liên quan