2012-02-08 24 views
3

この表からエンティティを削除または更新する前にprimefacesデータ表が更新されると問題が発生します。SQL文の実行が完了する前に遅延ロードされたprimefaces datatableが更新されます

01:08:13,255 INFO [reg.data.model.LazyEventDataModelMod] - Loading the lazy event data between 0 and 10 
01:08:13,256 DEBUG [org.hibernate.SQL] - 
    select 
     count(*) as col_0_0_ 
    from 
     events event0_ limit ? 
01:08:13,394 DEBUG [org.hibernate.SQL] - 
    delete 
    from 
     events 
    where 
     id=? 

問題は、エンティティマネージャがdelete \ updateクエリを正常に実行したことを示すために何も返さないということです。

JSF 2、Weld 1.1.5.Final、Primefaces 3.0.1、Seam persistence/transaction/solder 3.0.1を使用しています。
サーバはここ

のTomcat 7であるコントローラBeanのアクションを起動するボタンのコードである:

<p:commandButton id="deleteButton" value="#{msg.delete}" 
    icon="ui-icon-trash" update=":events_form :messages" 
    actionListener="#{eventController.delete()}" /> 

<p:commandButton id="refreshButton" value="#{msg.refresh}" 
    icon="ui-icon-refresh" update=":events_form :messages" /> 

最初のボタンが押された後に更新が発生しない、しかし2つ目はテーブルを更新し、どちらも同じAjax更新セクションを持ちます。

delete()メソッドのコード:DAOで

public void delete() { 
      if (getSelEvent() != null) { 
       log.debug("deleting event " + getSelEvent().getId()); 

       dao.delete(getSelEvent()); 

    // Tried putting the code for reloading te data model here, but it is also executed before the sql statements... 

      } else { 
       log.warn("delete action cannot proceed, no event selected!"); 
      } 

     } 

deleteById()メソッド:

​​

データテーブル:

<p:dataTable id="event_list" value="#{eventController.lazyModel}" 
       var="event" rowKey="#{event.id}" paginator="true" rows="20" 
       selection="#{eventController.selEvent}" selectionMode="single" 
       onRowSelectUpdate="content,messages" 
       onRowEditUpdate="content,messages" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="10,25,50,100"> 

LazyDataModelクラス:

public class LazyEventDataModel extends LazyDataModel<Event> { 

private static final long serialVersionUID = 2386224274507659474L; 

private EventDAO dao; 

private Logger log = Logger.getLogger(LazyEventDataModel.class); 

private List<Event> data; 

public LazyEventDataModel() { 
    dao = new EventDAO(); 
} 

@Override 
public Event getRowData(String rowKey) { 
    return dao.find(Long.parseLong(rowKey)); 
} 

@Override 
public Object getRowKey(Event event) { 
    return event.getId(); 
} 

@Override 
public List<Event> load(int first, int pageSize, String sortField, 
     SortOrder sortOrder, Map<String, String> filters) { 

    if (sortField == null || "".equals(sortField)) { 
     sortField = "event_date"; 
     sortOrder = SortOrder.DESCENDING; 
    } 

    if (sortField.equals("date")) 
     sortField = "event_date"; 

    // Get the paginated and sorted data 
    data = dao.findPageObjects(Event.class, first, pageSize, sortField, 
      sortOrder, filters); 

    log.infof("Loading the lazy event data between " + first + " and " 
      + (first + pageSize)); 

    // Set the row count 
    this.setRowCount(Global.safeLongToInt(dao.count())); 

    return data; 
} 
} 

私が考えることができる唯一の解決策は、dao.delete(getSelEvent())を呼び出してタイマーを追加し、そのタイマーの後にデータモデルをリフレッシュすることです。

答えて

0

commandButtonの更新属性にはデータテーブルも含める必要があります。アップデートに設定されているものは、ajax呼び出しが完了した時点で発生します。データベース操作を実行するために別のスレッドを作成していないことを考慮すると、ajaxリクエストはほぼ即座に終了します。

しかし、何らかの理由で、更新属性のデータテーブルのIDを参照しても機能しません。私は通常、それをpanelGroupでラップし、代わりにpanelGroupを更新するようにボタンに指示します。このような何か:あなたがすべてでJSF2のAJAXタグを必要としないので、primeFacesボタンコンポーネントは、デフォルトでAJAXを使用することを

<p:commandButton value="Delete" actionListener="#{someBean.delete}" update="panel"> 
</p:commandButton> 
<h:panelGroup id="panel"> 
<p:dataTable id="event_list" value="#{eventController.lazyModel}" 
       var="event" rowKey="#{event.id}" paginator="true" rows="20" 
       selection="#{eventController.selEvent}" selectionMode="single" 
       onRowSelectUpdate="content,messages" 
       onRowEditUpdate="content,messages" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="10,25,50,100"> 

... 

</h:panelGroup> 

注意。

+0

残念ながら、私が疑うように、問題はSQL文の前に実行されているajax呼び出しにあります。私は質問を言い換えてログを追加します。追加のコンポーネントを介してテーブルを参照することについての情報は便利ですが、通常はフォーム全体を更新するだけです。 – Shajirr

関連する問題