Как эффективно использовать связывающий фреймворк - PullRequest
3 голосов
/ 28 июля 2011

Я уже некоторое время использую связывающие фреймворки, и я хотел бы знать, как вы справляетесь с этими случаями.

У вас есть газета, которая имеет некоторые атрибуты, такие как

  • (Строка) заголовок
  • (логическое) опубликовано
  • (Дата) publishmentDate

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

Дело в том, что, поскольку мы используем обязательную основу, вы будете редактировать данные газет aнемного похоже на то, как если бы вы редактировали данные в БД ... привязывая каждое значение к полю независимо друг от друга.

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

Я думаю, что лучше иметь действие publish ()это установит флаг в true, но также обновит publishmentDate (и другую логику, если необходимо ...)

Мне просто интересно, как вы справляетесь с этим?

Я видел и думал о разных подходах:


1) Иногда мы привязываем новые параметры к существующему постоянному объекту ORM. Это означает, что мы получаемобъект непосредственно перед привязкой, так что мы привязываем значения к существующему, «уже заполненному» объекту объекта.Иногда это называется «увлажнение объекта». Таким образом, единственный способ узнать, нужно ли вам запускать «действие публикации», - это сравнить старое поле с новым, чтобы вы знали, было ли оно отредактировано и в каком направлении (ложно-> true = publish) Можно использовать прослушиватель ORM (например, @PostLoad, перехватчик Hibernate / EventListener или что-то еще), так что вы можете сохранить нужные значения «перед связыванием».

Это хорошо работаетно довольно странно запускать действие публикации на транспортном средстве, в то время как привязка уже установила флаг публикации на true.


2) Можно сделать почти то же самое, ноиспользуйте другой флаг ... например, флаг, который представляет пользователя, желающего опубликовать газету. Таким образом, вам не нужно сравнивать с предыдущим значением, вы просто проверяете, хочет ли пользователь опубликовать газету, и затем запускаетедействие ... (и настоящий опубликованный флаг был все еще = false, когда вы запустили действие на этот раз ...)

Дело в том, чтоt так как вы используете связывающий фреймворк, вы хотите, чтобы в вашем представлении был установлен флажок для опубликованных газет.Поэтому, если атрибут для привязки теперь опубликован, вам нужно установить его значение, или все ваши флажки всегда будут сняты ... Это означает, что перед показом представления вам нужно будет сделать что-то вроде publ_wish = опубликованораз флаг желания не будет сохранен, но я видел некоторые случаи, когда «желание» ДОЛЖНО БЫТЬ сохранено, поэтому нет необходимости делать publ_wish = Опубликовал


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


Могут быть и другие способы сделать это ...

Как бы вы это сделали?Так что это не просто хорошо работает, но оно также элегантно, обслуживаемо ... я не вижу здесь идеального решения

Ответы [ 2 ]

1 голос
/ 06 августа 2011

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

0 голосов
/ 04 августа 2011

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

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

Я действительно надеюсь, что они ответили на ваш вопрос или даже правильный вопрос в уме.

...