2012-02-08 3 views
3

이 테이블에서 엔티티를 업데이트하거나 제거하는 SQL 문이 실행되기 전에 primefaces 데이터 테이블이 업데이트되면 문제가 있습니다.SQL 문 실행이 완료되기 전에 지연로드 된 프라임 스 테이블 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을 사용합니다. 최종.
서버는 여기

컨트롤러 콩에 대한 작업을 호출 버튼의 코드는 톰캣 7 인 :

업데이트는 첫 번째 단추 후에 발생하지 않습니다

를 누르면

<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" /> 
, 그러나 두 번째는 테이블을 업데이트하고 둘 다 동일한 아약스 업데이트 섹션을 갖습니다. 삭제() 메소드의

코드 :

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()는 DAO의 방법

public void delete(T entity) { 
     if (em == null) 
      init(); 
     log.debugf("removing %s instance", simpleName); 

     entity = em.merge(entity); 

// The problem lies here - em.remove() does not return any value to indicate success/failure, so the control is released before the SQL statements finish execution 

em.remove(entity); 
} 

데이터 테이블 :

<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의 update 속성에는 데이터 테이블도 포함되어야합니다. 아약스 호출이 완료되면 업데이트에 설정된 내용이 모두 적용됩니다. 데이터베이스 작업을 수행하기 위해 별도의 스레드를 생성하지 않는다는 것을 고려하면 (즉각적으로 ajax 요청이 완료 될 수 있음) 다음과 같이하십시오.

하나의 경고 :하지만 업데이트 속성에서 데이터 테이블의 ID를 참조하는 것이 작동하지 않습니다. 난 보통 그냥 panelGroup 래핑하고 대신 panelGroup 업데이 트 버튼을 말해. 이런 식으로 뭔가 : 당신이 전혀 jsf2 아약스 태그를 필요가 없습니다 있도록 primeFaces 버튼 구성 요소는 기본적으로 아약스를 사용하는 것이

<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

관련 문제