2012-01-12 40 views
5

chúng tôi đang sử dụng ngủ đông với khóa lạc quan. Tất cả các thực thể của chúng tôi đều có chú thích @version.chiến lược cập nhật tốt nhất trên hibernate stalestateException

Điều này làm việc tốt, nếu người dùng cố gắng lưu một đối tượng cũ, chúng tôi sẽ nhận được một nhận định rõ ràng. Trong trường hợp của chúng tôi, chúng tôi muốn cung cấp cho người dùng màn hình thông báo để hủy thay đổi hoặc ghi đè các giá trị hiện tại trong cơ sở dữ liệu.

Trường hợp sử dụng phổ biến này cho các trường hợp ngoại lệ cũ. Câu hỏi của tôi liên quan đến trường hợp sử dụng này. Chiến lược tốt nhất là gì nếu người dùng quyết định ghi đè hàng cơ sở dữ liệu hiện tại bằng các thay đổi của mình? Tôi đã đi qua các hướng dẫn tham khảo ngủ đông và các trang web khác nhau nhưng tất cả những gì được đề cập có thực tế là bạn phải bắt stalestateexception mình và sau đó programmaticaly xử lý ghi đè dữ liệu. Tôi tự hỏi nếu hibernate có một số tiện ích để đơn giản hóa chiến lược này, điều đơn giản nhất tôi có thể thực hiện nếu người dùng quyết định ghi đè dữ liệu của mình là truy xuất phiên bản cuối cùng của thực thể từ cơ sở dữ liệu, sau đó sao chép tất cả các trường đã thay đổi sang đối tượng này và sau đó lưu đối tượng đã thay đổi trở lại cơ sở dữ liệu. Nhưng tôi không thể ngừng tự hỏi nếu không có một giải pháp thanh lịch hơn.

Trả lời

1

Tôi không nghĩ rằng Hibernate sẽ cố gắng giúp bạn với điều này bởi vì các yêu cầu trong lĩnh vực này có thể rất phức tạp và riêng biệt.

Tôi đoán rằng nếu người dùng lưu một đối tượng đã được người dùng khác thay đổi đồng thời, bạn sẽ không muốn chỉ cần tải đối tượng và sao chép tất cả các trường đã thay đổi và hoàn tác tất cả người dùng khác thay đổi . Điều gì xảy ra nếu cả hai người dùng đã thay đổi cùng một trường? Bạn wmight muốn trình bày hai phiên bản cho người dùng và yêu cầu họ quyết định phiên bản nào là chính xác. Một chút giống như sáp nhập các thay đổi trong một hệ thống kiểm soát phiên bản. Ngoài ra, bạn có thể có xác thực cấp độ giao diện người dùng liên kết các trường có thể bị vi phạm nếu bạn chỉ cần hợp nhất hai phiên bản của cùng một thực thể trong phần cuối và tiếp tục tồn tại trong các phiên bản đó.

+0

Trong một số trường hợp, chúng tôi thực sự tạo một 'hợp nhất ui'. Nhưng có một số trường hợp sử dụng trong đó dữ liệu không quan trọng đủ để chỉ được ghi đè, tôi đã tự hỏi nếu có một số phương pháp mặc định cho điều này hoặc nếu bạn chỉ cần có để viết các thuật toán chính mình. –

+0

Không phải là tôi biết tôi sợ. –

+1

Đó là một câu hỏi hay. Tôi đã dành khá nhiều thời gian suy nghĩ về cách tốt nhất để giải quyết tình huống này! –

0

Theo kinh nghiệm của tôi, để giới thiệu một số tự động hóa trong trường hợp này tôi đã sử dụng để thực hiện thủ thuật sau đây. Tôi tải lại thực thể và đặt giá trị của phiên bản cuối cùng từ nó thành đối tượng cũ của tôi mà trước đó đã không lưu được. Sau đó, tôi đã làm merge() truyền đối tượng cũ của tôi. Bằng cách đó tất cả các trường được ghi đè, phiên bản được cập nhật và sẵn sàng để lưu. Tất nhiên tất cả các tài liệu tham khảo liên quan phải được chăm sóc theo cùng một cách.

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