【问题标题】:How to check if instance entity has been modify in the view?如何检查视图中的实例实体是否已被修改?
【发布时间】:2016-04-06 23:48:40
【问题描述】:

我需要一个指南。 假设我正在从 db 中获取一些记录,并使用这些记录填充一个 ui 数据表。

数据表可以修改记录的值,因为它的列是输入。

<p:dataTable value="#{videogames.videogameList}" var="vg"  >
        <p:column headerText="Name">
            <p:inputText value="#{vg.name}" />
        </p:column>
</p:dataTable>

我如何知道是否为了更新数据库中的值而修改了某些行?

我应该检查列表中的每个元素并将其与具有原始值的时间数组列表进行比较吗?有没有更“优雅”的方式来做到这一点?

你知道任何可以帮助我学习所有这些的教程或文档吗?

谢谢!

我正在使用 Java、JSF、primafaces 和 JPA。

【问题讨论】:

    标签: jsf primefaces datatable audit


    【解决方案1】:

    我希望我可以将它作为评论发布,但我缺乏它的代表。我希望它可以作为一个答案(因为您已经要求学习它的资源)。

    我也使用 PrimeFaces,但我个人还没有处理可编辑的行。浏览我在下面给出的链接,您想要的应该可以通过 RowEditEvent 实现。

    PrimeFaces 展示本身就是一个教程。这是可编辑数据表的链接:

    http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml

    浏览 xhtml 和 .java 示例。它应该引导您朝着正确的方向前进。

    PrimeFaces 文档也是一个很好的信息来源:

    http://www.primefaces.org/docs/guide/primefaces_user_guide_5_3.pdf

    【讨论】:

    • 行编辑没有任何指示实际数据是否已更改...
    【解决方案2】:

    有一个名为rowEdit 的 Ajax 事件可以帮助您。有一个名为rowEditCancel 的补充事件来检测用户何时退出编辑。

    primefaces 网站提供了一份用户指南,其中详细介绍了数据表和框架的其余部分。这是最新版本 5.3 的链接。

    primefaces 5.3 users guide

    【讨论】:

    • 行编辑没有任何指示实际数据是否已更改...
    【解决方案3】:

    我想我找到了解决这个案子的办法。

    我所做的是添加一个带有 event="change" 的 ajax 侦听器,到可以修改行值的 inputtext 中,因此每次值更改时,侦听器都会通过行作为方法的参数,该方法会将行添加到列表中:

    videogames.xhtml

        <p:column headerText="Nombre">
            <p:inputText value="#{vj.nombre}">
               <!--this is the added listener-->
               **<f:ajax event="change" listener="#{videojuegos.rowSelectedTest(vj)}" />**
            </p:inputText>
        </p:column>
    
       <!-- **Button that calls the method for updating the modify entities columns**-->
       <p:commandButton  value="Actualizar" actionListener="#{videojuegos.updateVideojuego()}"/>
    

    托管 bean 接收它,并将其添加到列表中:

    VideoGamesManagedBean.java

     List  <Videojuego> videojuegoUpdate = new ArrayList<Videojuego>();
    //adds the modify row to a list
    public void rowSelectedTest(Videojuego videojuego){
         videojuegoUpdate.add(videojuego);
     }
    
    //calls the method in the EJB for merging each object in the list
    public void updateVideojuego(){
    
         if(videojuegoUpdate != null && !videojuegoUpdate.isEmpty() ){
            vjbean.mergeVideojuegoList(videojuegoUpdate);
             //after merging, cleans up the arraylist.
             videojuegoUpdate.clear();
         }
     }
    

    最后,EJB 遍历列表并合并每个对象

    VideoGameBean.java

    @PersistenceContext
    private EntityManager em;
    
    public void mergeVideojuegoList(List<Videojuego> listVideojuegoUpdate){
       for(Videojuego vjUpdate : listVideojuegoUpdate ){
           em.merge(vjUpdate);
       }
    

    }

    注意:

    唯一的“问题”是,如果我在点击命令按钮“Actualizar”之前多次修改同一列,列表将与同一行一起增长。但是merge方法会取该列的最后一个“版本”。所以对于我们的需要来说,是可以的。

    感谢之前的回答,问候!!

    如果您知道任何更好的方法或发现任何极端情况,请告诉我!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2012-11-08
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多