2012-05-18 41 views
14

Tôi đã làm việc trên một dịch vụ web RESTful với dữ liệu mùa xuân. Cách đây vài ngày, khung công tác REST đặc biệt của dữ liệu vào mùa xuân was released.Sử dụng @Version trong dự án dữ liệu xuân

Bây giờ tôi nhận thấy khả năng sử dụng @Version với khung này. Là phiên bản này được tạo ra bởi chính nó hoặc bạn cần phải làm điều này bằng tay?

Và có thể sử dụng @Version trên chính nó không? (Vì vậy, tôi không phải thay đổi bất kỳ thứ gì cho kho/miền hiện tại của mình, v.v ..)

Và tôi có cần phải thực hiện thêm một số cấu hình để sử dụng @Version không?

Trả lời

34

Đã lâu rồi tôi mới đăng câu hỏi này nhưng tôi đã tìm ra câu hỏi đó. Tôi sẽ giải thích những gì tôi đã làm để nó có thể hữu ích cho người khác.

Chú thích @Version là giao diện javax.persistence chứ không phải khung jpa còn lại dữ liệu vào mùa xuân như tôi đã đề cập trước đó.

Nếu bạn muốn tận dụng @version bạn cần phải tạo ra một trường phiên bản trong đối tượng tên miền của bạn như sau:

@Version 
@Column(name = "VERSION") 
private long version; 

Nếu bạn đang sử dụng hibernate nó sẽ tự động lấy các chú thích và nó sẽ tạo ra một hàng "phiên bản" trong bảng (trong trường hợp của tôi MySql) của bạn. Mỗi khi một bản ghi được cập nhật, hibernate sẽ tăng bộ đếm với 1.

Bây giờ tại sao lại là thứ bạn muốn? Lý do tại sao bạn có thể muốn sử dụng điều này là bởi vì nó làm giảm cơ hội mà khách hàng của bạn đang làm việc với stale data. Bất cứ khi nào một khách hàng truy xuất thông tin từ bạn một phiên bản được cung cấp cùng với dữ liệu mà anh ta yêu cầu. ví dụ.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "De regenboog", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Bây giờ nếu khách hàng muốn thay đổi một số thông tin về hồ sơ cụ thể này, nó sẽ gửi thông tin mới cùng với giá trị phiên bản. Trong trường hợp này, hãy đổi tên trường.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "Stackoverflow", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Hibernate đưa ra truy vấn kèm theo thông tin của bạn và thêm mệnh đề 'where' để kiểm tra phiên bản. update .... where id = 1 and version = 0. Bây giờ nếu hàng được cập nhật, điều đó có nghĩa là bạn đã cung cấp đúng phiên bản và không ai khác đã thay đổi thông tin cụ thể đó giữa thời gian bạn yêu cầu thông tin, thay đổi nó và gửi lại. Tốt đẹp?

Bây giờ nếu hàng không được cập nhật thì sao? Điều đó có nghĩa là ai đó đã cập nhật hàng đó trong khi bạn đang nghỉ ngơi nhanh sau khi bạn yêu cầu thông tin. Nó có nghĩa là phiên bản của bạn đã lỗi thời! Những gì cần phải xảy ra bây giờ là thực sự sử dụng trường hợp cụ thể vì vậy tôi sẽ không đi vào chi tiết về điều đó :)

Hy vọng ai đó có thể sử dụng thông tin này!

Cảm ơn tất cả

+0

Điều đó có ý nghĩa.Nó đã giúp tôi.Thanks – kalz

1

Hãy chắc chắn để nhập nhập khẩu javax.persistence.Version

và không phải là mùa xuân một.

+0

Tôi đã thêm vào câu trả lời của mình: "Chú thích @Version là giao diện javax.persistence chứ không phải khung jpa còn lại của dữ liệu vào mùa xuân như tôi đã đề cập trước đó". –

+1

Quan trọng đối với lý do ghi chú.Chú thích Spring @Version dành cho mọi thứ trừ JPA. Xem http://stackoverflow.com/a/31883006/328808. –

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