2017-11-18 21 views
0

내가는 여기에 제시 등의 클릭으로 셀 편집과 DataTables를 만들려고 해요 : https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtmlP : DataTable을하지 편집

내가 가진 문제는 테이블이 계정에 수정을하지 것입니다. MySQL 데이터베이스에서 데이터를 표시하는 데 문제가 없습니다. 테이블이 오류없이 올바르게로드됩니다. 셀을 수정하려고하면 예상대로 입력이됩니다. 그러나 값을 변경하고 Enter 키를 누르면 셀이 원래 값으로 돌아갑니다. 해당 셀에 편집 모드로 다시 들어가면 변경 사항이 다시 나타납니다. 데이터베이스에서 수정하지 않습니다.

저는 JSF와 PrimeFaces에 대해별로 편하지 않습니다. 분명히 분명하지는 않습니다.

관리 콩 :

package Application; 

import java.io.Serializable; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.inject.Named; 
import javax.faces.view.ViewScoped; 
import org.primefaces.event.CellEditEvent; 
import org.primefaces.event.RowEditEvent; 


@Named(value = "plantCtrl") 
@ViewScoped 

public class PlantCtrl implements Serializable { 

    @EJB 
    private PlantDAO plantDAO; 

    public PlantCtrl() { 
    } 

    @PostConstruct 
    public void init(){ 
    } 

    public List<Plant> getPlants() { 
     return plantDAO.allPlants(); 
    } 

    public PlantDAO getPlantDAO() { 
     return plantDAO; 
    } 

    public void setPlantDAO(PlantDAO plantDAO) { 
     this.plantDAO = plantDAO; 
    } 

    public void onRowEdit(RowEditEvent event) { 
     FacesMessage msg = new FacesMessage("Plant Edited"); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public void onRowCancel(RowEditEvent event) { 
     FacesMessage msg = new FacesMessage("Edit Cancelled"); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public void onCellEdit(CellEditEvent event) { 
     Object oldValue = event.getOldValue(); 
     Object newValue = event.getNewValue(); 

     if(newValue != null && !newValue.equals(oldValue)) { 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
     } 
    } 
} 

PlantDAO : 여기

내 코드입니다

package Application; 

import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 

@Stateless 
public class PlantDAO { 

    @PersistenceContext(unitName = "CarnivorousGardenPU") 
    private EntityManager em; 

    public List<Plant> allPlants() { 
     Query query = em.createNamedQuery("Plant.findAll"); 
     return query.getResultList(); 
    } 

    public void add(Plant p) { 
     em.persist(p); 
     em.flush(); 
    } 

    public void edit(Plant p) { 
     em.merge(p); 
     em.flush(); 
    } 

    public void remove(Plant p) { 
     em.remove(em.merge(p)); 
     em.flush(); 
    } 
} 

XHTML :

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> 

    <h:head> 
     <title>Dashboard</title> 
    </h:head> 

    <h:body> 

     <ui:include src="inc/header.xhtml" /> 

     <h:form id="plantAdminList"> 

      <p:growl id="msgs" showDetail="true"/> 

      <p:dataTable id="plantsTable" var="plant" value="#{plantCtrl.plants}" editable="true" editMode="cell" widgetVar="cellPlants"> 
       <f:facet name="header"> 
        Cell Editing with Click and RightClick 
       </f:facet> 

       <p:ajax event="cellEdit" listener="#{plantCtrl.onCellEdit}" update=":plantAdminList:msgs, :plantAdminList:plantsTable" /> 

       <p:column headerText="Id"> 
        <p:cellEditor> 
         <f:facet name="output"><h:outputText value="#{plant.genusPlant}" /></f:facet> 
         <f:facet name="input"><p:inputText id="modelInput" value="#{plant.genusPlant}" style="width:96%"/></f:facet> 
        </p:cellEditor> 
       </p:column> 

       <p:column headerText="Price"> 
        <p:cellEditor> 
         <f:facet name="output"><h:outputText value="#{plant.pricePlant}" /></f:facet> 
         <f:facet name="input"><p:inputText value="#{plant.pricePlant}" style="width:96%" label="Price"/></f:facet> 
        </p:cellEditor> 
       </p:column> 

      </p:dataTable> 

     </h:form> 

     <ui:include src="/inc/footer.xhtml" /> 

    </h:body> 

</html> 

Plant.java 같이 넷빈즈에 의해 자동으로 생성됩니다 ~ 데이터베이스의 엔티티 클래스. 이 게시물에 과부하가 걸리지 않도록 게시하고 있지만 필요한 경우 주저하지 말고 요청하십시오. 이

//.... 

List<Plant> plants; 

@PostConstruct 
public void init(){ 
    plants=plantDAO.allPlants(); 
} 

public List<Plant> getPlants() { 
    return plants; 
} 

//.... 

당신이 원하는대로 작동처럼 관리 빈의

+0

안녕하세요, 무엇을 필요로하는 것은 [mcve은]입니다 . 이것은 문제를 해결할 때 도움이됩니다. (때로는 문제를 직접 해결할 때도 도움이됩니다) ... – Kukeltje

+0

그리고 이러한 종류의 문제 중 99.9 %는 jsf와 데이터베이스와 관련이 없습니다. 그냥 그것을 분리하고 값이 서버에서 끝나는 지 확인하십시오. 그렇지 않은 경우에는 순전히 jsf와 관련이 있습니다. 그것은 그것이 데이터베이스와 관련이 있습니다. abs not jsf – Kukeltje

답변

1

수정 몇 줄 : 당신은 가치를 눌러 입력 변경하면 셀 변경 사항을 반영합니다.

주의한다 :

당신이 수정을 감지하고 이미 plantDao.edit 방법을 기존에 전달하기 위해 p:dataTable 조금 수정하고 관리 빈에서 추가 로직을 작성해야합니다 데이터베이스에 변경을 유지하려는 경우. 코딩의 최소는 다음과 같습니다이

p:dataTable id="plantsTable" var="plant" value="#{plantCtrl.plants}" editable="true" widgetVar="cellPlants"> 

    <p:ajax event="rowEdit" listener="#{plantCtrl.onRowEdit}" 
      update=":plantAdminList:msgs, :plantAdminList:plantsTable" /> 
.... 
    <p:column style="width:32px"> 
     <p:rowEditor /> 
    </p:column> 
</p:dataTable> 
  • 수정 onEditMethod 내부 관리 빈 같은

    1. 수정 데이터 테이블

      public void onRowEdit(RowEditEvent event) { 
          Plant editedPlant = (Plant)event.getObject(); 
          plantDAO.edit(plant); 
      
          FacesMessage msg = new FacesMessage("Plant Edited"); 
          FacesContext.getCurrentInstance().addMessage(null, msg); 
      } 
      
  • +0

    안녕하세요, 답변 해 주셔서 감사합니다. 내가 데이터를 어떻게 유지할 수 있는지 아십니까? 문제는 event.getNewValue()가 셀에 따라 string, float 등을 반환한다는 것입니다. 객체 자체를 반환하지 않으므로 이후에 내 edit 메소드를 사용하는 것이 복잡해집니다. 이벤트에서 편집 된 객체를 가져 오는 방법이 있습니까? – Cephou

    +0

    @Cephou, 나는 나의 대답을 추가 설명으로 업데이트했다. 또한이 [subject] (https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml)에 대한 문서를 확인하십시오. –