2016-10-04 4 views
2

Подробное объяснение потока приложений, которое у меня есть в приложении. Я работаю над приложением Database Viewer. Пользователь может видеть все записи (строки) в моей БД с помощью этого приложения и редактировать их из пользовательского интерфейса. Это приложение работает нормально. Теперь я хочу реализовать оптимистическую блокировку для этого, я создал поле версии в БД. Теперь я ударил с проблемой дизайна,Spring MVC Hibernate save Java Объект между ответом и запросом

До сих пор в моем приложении, когда пользователь просматривает запись и хочет ее отредактировать, в моем методе контроллера я делаю загрузку спящего режима и выводя результат на странице редактирования JSP. Теперь, когда пользователь нажимает «Сохранить» на странице, мне нужно сохранить запись. Поскольку это очень сложный объект, я повторно заполняю этот объект из базы данных и внося изменения и сохраняя или обновляя Hibernate.

Теперь я хочу реализовать управление версиями, поэтому я больше не хочу повторно заполнять объект до того, как сохранить или обновить. Как-то я хочу сохранить свой сложный объект в безопасности и использовать его, когда хочу обновить. Поля скрытой формы JSP невозможны в моем случае. Где я могу сохранить свою сущность до тех пор, пока пользователь не нажмет кнопку «Сохранить» и не будет использовать ее для сохранения в db ?. Каковы возможные и лучшие подходы.

Update:

Я рассмотрел различные посты в Интернете и планирования для реализации рамок Ehcache.

+2

Сессия будет очевидным местом. http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html –

+0

@AlanHay Но как-то, теперь, когда я это делаю (session.getAttribute ("obj")). equals (DAO. get (...)) не совпадают. Я становлюсь ложным. Я проверил метод eqauls для всех переменных-членов объекта. Они должны быть равными? – EagleRider

ответ

1

У вас есть два варианта:

магазин состояние на сервере (в сессии) или на клиенте (в скрытых полях формы). Вы можете защитить данные клиента с помощью HMAC, но для этого требуется время обработки. Я рекомендовал бы на стороне сервера сессии для удобства

Мой ответ здесь включает в себя пример того, как использовать сеанс с оптимистической блокировки: Spring MVC: Validation, Post-Redirect-Get, Partial Updates, Optimistic Concurrency, Field Security

+0

Thank you @Neil – EagleRider

+0

есть ли какой-либо вариант, кроме использования сеанса?. Почему я настаиваю на том, что мы не хотим загружать сервер (мы хотим остановить потребление памяти для большего количества сеансов). Есть ли способ кэшировать объект, используя кэширование Hibernate или стороннюю помощь? – EagleRider

+0

@EagleRider вы можете сохранить состояние в скрытых формах полей в браузере –

0

То есть то, что @SessionAttributes для. Независимо от того, как вам нужно хранить объект где-то, вы можете попытаться объединиться и выяснить свой собственный или использовать решение по умолчанию.

@SessionAttributes("your-model") 
@Controller 
public class YourController { 

    @RequestMapping(method = GET) 
    public String show(long id, Model model) { 
     // Get your entity 
     model.addAttribute("your-model", entity); 
     return "edit"; 
    } 

    @RequestMapping(method = POST) { 
    public String show(@Valid @ModelAttribute("your-model") YourModel model, SessionStatus status) { 
     // Save your entity 
     status.setComplete(); 
     return "list"; 
    } 
} 

Независимо от способа реализации, вы все равно должны иметь свои данные (частично) в памяти. И, как упоминалось ранее, вы можете попробовать взломать свое решение или использовать механизм пружины по умолчанию.

Решения, подобные EhCache, по-прежнему хранят вещи в памяти, могут быть загружены в другое хранилище, если это необходимо. То же самое можно настроить для сеансов (в зависимости от вашего контейнера). Или используйте что-то вроде Spring Session, чтобы иметь разные варианты.

В любом случае, я начну с хранения его в сеансе, а затем начну измерять, и если это действительно станет проблемой, выясните другой способ хранения ваших объектов между запросами. Но начните просто, измерьте, а затем улучшите, а не пытайтесь решить проблемы, которые могут возникнуть.

+0

@ m-deinum Проблема с использованием сеанса в моем случае - это распределенная производственная среда. Они не гарантируют, что каждый запрос будет работать на одном сервере. Как я могу использовать сеанс в таком случае. – EagleRider

+0

Как уже упоминалось, вы можете использовать Spring Session (ссылка включена в ответ). –