如何检查实例实体是否已在视图中修改?

How to check if instance entity has been modify in the view?

我这里需要一个guide。 假设我正在从数据库中获取一些记录,并且正在用这些记录填充 ui 数据表。

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

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

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

我是否应该检查列表中的每个元素并将其与具有原始值的时间数组列表进行比较?还有更多 "elegant" 的方法吗?

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

谢谢!

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

我希望我可以 post 它作为评论,但我缺少它的代表。我希望它能作为一个答案(因为你已经要求了解它的来源)。

我也使用 PrimeFaces,但我个人还没有处理过可编辑的行。浏览我在下面给出的 links,你想要的应该可以用 RowEditEvent.

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

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

浏览 xhtml 和 .java 示例。它应该 bootstrap 你在正确的方向。

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

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

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

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

primefaces 5.3 users guide

我想我找到了这个案例的解决方案。

我所做的是添加一个 ajax 带有 event="change" 的侦听器到可以修改行值的输入文本,所以每次值改变时,侦听器都会将该行作为参数传递给方法,该方法会将行添加到列表中:

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);
   }

}

注意:

唯一的 "problem" 是,如果我在点击命令按钮 "Actualizar" 之前多次修改同一列,则列表将增长为同一行。但是merge方法会取到列的最后一个"version"。所以对于我们的需求来说,是可以的。

感谢前面的回答,问好!!

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