2014-07-18 12 views
9

Có một ngoại lệ nổi tiếng:"Bản đồ giá trị chưa lưu của Hibernate" có nghĩa là gì?

org.hibernate.StaleObjectStateException: Row đã được cập nhật hoặc xóa bởi giao dịch khác (hoặc bản đồ chưa được lưu giá trị không chính xác): [my.Entity # 123456]

Đây là một tình huống rất quen thuộc khi "hàng được cập nhật hoặc xóa bởi một giao dịch khác".

Nhưng điều gì có nghĩa là một khả năng khác - "ánh xạ giá trị chưa được lưu là không chính xác"? Và làm thế nào để tái tạo tình huống như vậy một cách có chủ ý?

Grails 2.2.0

Trả lời

6

Đối với một mô tả về chưa được lưu giá trị nhìn thấy http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id:

chưa được lưu giá trị (không bắt buộc - mặc định là một giá trị "hợp lý"): một giá trị tài sản định danh cho biết một thể hiện mới được khởi tạo (chưa được lưu), phân biệt nó với các cá thể tách rời mà được lưu hoặc tải trong phiên trước đó.

Hibernate cần điều này trong trường hợp hiếm hoi, khi saveOrUpdate() không thể xác định xem thực thể là mới hay tách rời.

Nếu thực thể được xác định bằng giá trị chưa lưu của bạn như đã tách, nhưng thay vì mới, thì hibernate không thể so sánh số phiên bản (vì thực thể không tồn tại trong cơ sở dữ liệu). Nhưng Hibernate không thể biết nếu ánh xạ giá trị chưa được lưu của bạn không đúng hay thực thể đã bị xóa trong một giao dịch khác. Này được mô tả trong org.hibernate.StaleStateException cũng như:

Ném khi một số phiên bản hoặc dấu thời gian kiểm tra thất bại, cho thấy rằng phiên chứa dữ liệu cũ (khi sử dụng các giao dịch dài với phiên bản). Cũng xảy ra nếu chúng tôi thử xóa hoặc cập nhật một hàng mà không tồn tại.

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