我一直在使用绑定框架一段时间了,我想知道你是如何处理这种情况的。
你的报纸有一些属性,比如
在您的视图中,您有一份报纸列表,而不是可以同时编辑所有报纸。这意味着您可以在一个请求中更改所有新闻报道的标题或所有状态“已发布”。
问题是,当我们使用绑定框架时,您将编辑报纸的数据,就像您在数据库中编辑数据一样...将每个值绑定到一个字段,彼此独立。
但是......我想做的是,当我发布报纸时,发布日期更新到当前日期。 我当然可以在表单上放置一个publishmentDate字段,甚至是设置为当前日期的隐藏字段......但这不是干净或安全的。
我认为最好有一个动作发布()将标志设置为true,但也更新publishmentDate(以及其他逻辑,如果需要......)
我只是想知道你是如何处理的?
我已经看过并考虑过不同的方法:
1)有时我们会将新参数绑定到现有的持久性ORM实体。 这意味着我们在绑定之前检索实体,以便将值绑定到现有的“已填充”实体对象。这有时被称为“保湿实体” 因此,知道是否必须启动“发布操作”的唯一方法是将旧字段与新字段进行比较,以便了解它是否已编辑以及在哪个方向上进行(false-> true = publish) 可以使用ORM监听器(如@PostLoad,Hibernate Interceptor / EventListener或其他任何东西),以便保留这些“绑定前”所需的值。
这很好但是在车辆上发布发布动作非常“奇怪”,而绑定已经将已发布的标志设置为true。
2)可以做几乎相同的事情,但使用另一个标志......例如,表示用户希望发布报纸的标志。 因此,您无需与之前的值进行比较,只需检查用户是否希望发布报纸然后启动操作...(此次启动操作时,实际发布的标志仍为= false。 ..)
问题在于,当您使用绑定框架时,您希望在已查看已发布的报纸的视图上检查已发布的复选框。 因此,如果绑定属性现在已发布_wish,则必须将其设置为值,否则所有复选框将始终未选中... 这意味着在显示视图之前,您将执行类似published_wish = published的操作 大多数时候,愿望标志不会被持久化,但我已经看到了一些“愿望”必须坚持的情况,因此无需发表已发表的文章=已发表
3)使用空的非持久化实体进行绑定,然后将此非持久化实体的值重新复制到真实持久化对象。 因此,当您将值从一个对象重新复制到另一个对象时,您可以启动所需的任何操作,自定义所有内容...... 但重新复制所有这些参数有点重...
可能有其他方法......
你会怎么做?所以它不仅运作良好,但它也优雅,可维护 ......我在这里看不到任何完美的解决方案
答案 0 :(得分:1)
我同意你的观点,在这种情况下我也会使用发布按钮(可能还有“取消发布”按钮),允许用户选择多篇文章并一次发布。我不允许用户直接编辑Published复选框和发布日期。
答案 1 :(得分:0)
这个问题没有打开我,但如果你希望优雅地保存发布日期,你为什么不留下数据库来为你做。在Mysql上,您有示例here,数据库会自动为用户保存 lastChanged 数据。
同样database triggers可能会为您提供帮助。至少我看到自动确切的数据库查询比解决这些问题的代码中的一堆黑客更好的解决方案。
我希望这些能够回答你的问题,甚至是正确的问题。