2012-07-09 30 views
22

Tôi đã lướt qua một số tài liệu về Grails và tìm thấy this bit về phương pháp read() trong Grails. Nếu tôi hiểu chính xác điều này, bạn có thể kéo phiên bản "chỉ đọc" của đối tượng từ cơ sở dữ liệu sẽ chỉ được lưu trên cuộc gọi save() rõ ràng. Dường như với tôi sau đó, rằng bạn nên sử dụng một cuộc gọi read() bất cứ khi nào bạn có một đối tượng mà bạn không mong đợi để được thay đổi.Lợi ích của object.get() vs object.read() trong Grails

Nhưng tại sao bạn không phải lúc nào cũng sử dụng cuộc gọi read()? Vì đối tượng sẽ được thay đổi thành quyền đọc/ghi nếu bạn save() dù sao, sẽ không an toàn hơn khi chỉ đọc trong đối tượng thay vì nhận nó?

Trả lời

17

Bạn có thể đúng - tương đương với hầu hết các trường hợp. Nhưng Hibernate không yêu cầu bạn gọi save() vì nó kiểm tra bẩn trong khi xả và vì Grails sử dụng trình chặn chặn "Phiên làm việc mở trong Chế độ xem" sẽ luôn có hiệu lực ở cuối mỗi yêu cầu. Điều này làm bất ngờ những người thực hiện các thay đổi trong một phiên bản được truy xuất bởi get() chỉ nhằm mục đích tạm thời trong khi hiển thị chế độ xem nhưng sau đó thay đổi vẫn được duy trì liên tục mà không cần cuộc gọi save(). read() sẽ có ý nghĩa hơn trong kịch bản đó.

Một tối ưu hóa hiệu suất là sử dụng http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html để chỉ đẩy các trường đã thay đổi vào cơ sở dữ liệu. Mặc định là để đẩy tất cả các lĩnh vực cho dù họ đang thay đổi hay không kể từ đó không cần phải tạo SQL mới cho mỗi bản cập nhật. Nếu bạn read() một trường hợp Hibernate không giữ dữ liệu gốc để cập nhật động sẽ không thể thực hiện được vì sẽ không có cách nào để biết trường nào bị bẩn.

+0

Vì vậy, nếu bạn đọc() và đối tượng và thực hiện thay đổi thuộc tính và toàn bộ phiên bị xóa thì đối tượng đó sẽ không được truyền cho cơ sở dữ liệu chính xác? Đối tượng sẽ chỉ nhận được flushed khi bạn gọi một cách rõ ràng save() trên instance đó. Điều này có đúng không? – Viriato

+1

Chính xác - về cơ bản nó vô hiệu hóa tính năng tự động tuôn ra, nhưng không vô hiệu hóa việc xóa hoàn toàn –

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