2012-07-09 13 views
22

Przeglądałem niektóre z dokumentacji Grails i znalazłem this trochę o metodzie read() w Grails. Jeśli rozumiem to poprawnie, możesz pobrać wersję "tylko do odczytu" obiektu z bazy danych, która zostanie zapisana tylko w jawnym wywołaniu save(). Wydaje mi się, że powinieneś użyć wywołania read(), gdy masz obiekt, którego nie spodziewałeś się zmienić.Korzyści z object.get() vs object.read() w Grails

Ale dlaczego nie po prostu zawsze używałbyś połączenia read()? Ponieważ obiekt zostanie zmieniony na uprawnienia do odczytu/zapisu, jeśli tak czy inaczej, czy nie byłoby bezpieczniej odczytywać obiekt zamiast go pobierać?

Odpowiedz

17

Prawdopodobnie masz rację - w większości przypadków byłaby odpowiednia. Ale Hibernate nie wymaga, abyś zadzwonił pod numer save(), ponieważ robi on brudne sprawdzanie podczas spłukiwania, a ponieważ Grails używa przechwytywacza "Otwórz sesję w widoku", zawsze pojawi się kolor na końcu każdego żądania. To zaskakuje ludzi, którzy wprowadzają zmiany w instancji pobranej przez get(), które miały być jedynie tymczasowe podczas renderowania widoku, ale wtedy i tak zmiany zachowują się pomimo braku połączenia save(). read() miałoby więcej sensu w tym scenariuszu.

Jedną z optymalizacji wydajności jest użycie http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html, aby przesyłać tylko zmienione pola do bazy danych. Domyślnie pchnąć wszystkie pola, czy są one zmienione, czy nie, ponieważ nie ma potrzeby generowania nowego SQL dla każdej aktualizacji. Jeśli jesteś read() wystąpienie Hibernate nie zachowuje oryginalnych danych, więc aktualizacja dynamiczna nie byłaby możliwa, ponieważ nie byłoby sposobu, aby wiedzieć, które pola są brudne.

+0

Więc jeśli czytasz() i obiekt i dokonasz zmiany właściwości i cała sesja zostanie przepłukana, to ten obiekt nie będzie propagowany do bazy danych? Obiekt zostanie przepłukany tylko wtedy, gdy jawnie wywołasz metodę save() w tej instancji. Czy to jest poprawne? – Viriato

+1

Prawidłowo - w zasadzie wyłącza funkcję automatycznego płukania, ale nie wyłącza wyraźnego spłukiwania –

Powiązane problemy