2012-02-28 27 views
8

Từ những gì tôi đã đọc, save() thông báo cho ngữ cảnh bền vững rằng một cá thể cần được lưu hoặc cập nhật. Tuy nhiên, tôi có các phương thức trong một dịch vụ thay đổi thuộc tính của một cá thể miền mà không gọi save() và thay đổi xuất hiện ngay lập tức trong cơ sở dữ liệu của tôi, không có vấn đề gì.Khi nào tôi nên gọi save() trên một thể hiện của đối tượng miền trong Grails?

Phương pháp save() chỉ là một cách an toàn hơn để biết rằng một cá thể miền sẽ được cập nhật sau khi thực hiện thay đổi (và bắt lỗi với ánh xạ failOnError)? Nó có nên được sử dụng MỌI thời gian tôi thay đổi thuộc tính của một cá thể của miền hay là lạm dụng nó không?

+0

Cơ sở dữ liệu có được cập nhật ngay lập tức hoặc bộ nhớ đệm ngủ đông của bạn đang được cập nhật ngay lập tức không? – doelleri

+0

Cơ sở dữ liệu MySql mà tôi đang sử dụng đang được cập nhật. – Weezle

Trả lời

8

Nếu bạn tạo một thể hiện mới của một lớp miền, sau đó một cuộc gọi .save() sẽ cho lớp Hibernate cơ bản tiếp tục tồn tại đối tượng mới vào cơ sở dữ liệu. Nếu không có .save(), nó sẽ không được lưu vào cơ sở dữ liệu.

Nếu bạn truy xuất đối tượng qua .get(myId), thì mọi thay đổi sẽ tự động được lưu vào cơ sở dữ liệu ở cuối giao dịch cơ bản vì Hibernate thấy đối tượng là "bẩn". Sự kết thúc của một giao dịch là vào cuối của một cuộc gọi phương thức đến một dịch vụ giao dịch hoặc kết thúc một yêu cầu cho bộ điều khiển. Bạn có thể gọi .save() nếu bạn muốn trong những trường hợp này, nhưng không cần thiết. Nó cung cấp truy cập dễ dàng để xả Hibernate qua .save(flush:true) hoặc sử dụng failOnError để xác thực.

+0

Tôi sử dụng một .findBy() để lấy đối tượng nhưng tôi cho rằng nó có cùng hiệu ứng "save-at-the-end-of-the-method" dưới dạng .get. – Weezle

+0

Có, sự tồn tại xảy ra đối với bất kỳ phương pháp lấy một đối tượng hiện có, trừ khi nó là một truy vấn chỉ đọc như '.read()'. – schmolly159

+0

Tận dụng xác thực có lẽ là một trong những cách sử dụng phổ biến nhất của 'save()' bên ngoài sự tồn tại của một cá thể mới. – cdeszaq

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