2014-02-21 5 views
0

Я могу обновить базу данных, так что для каждой секции пользователь сохраняет ее, она там хорошо работает, в правильном столбце базы данных, но то, что я сейчас пытаюсь достичь, вместо сохранения в новую строку, проверьте там studentNumber, и если у нее уже есть запись в таблице (которая должна будет зайти так далеко), обновите колонки до этой записи, а не начните новую.Как объединить записи вместе

как я могу это сделать?

В настоящее время это мой код:

это u.i. где они выберите значение и нажмите отправить

      <p:spinner id="ajaxspinner80-100" value="#{editMarkingBean.markSectionTwo.markSectionTwo}" 
             stepFactor="1" min="80" max="100" disabled="#{formBean.number != 8}"> 
           <p:ajax update="ajaxspinnervalue" process="@this" /> 
          </p:spinner> 

кнопку СОХРАНИТЬ

    <p:commandButton action="#{editMarkingBean.markSectionTwo}" value="#{bundle.buttonSave}" update=":growl" icon="ui-icon-disk"/> 

подкладочный боб:

@Named(value = "editMarkingBean") 
@ViewScoped 
public class EditMarkingController { 

    private String searchString; 
    private String ordering; 
    private String criteria; 
    private String match; 
    private Date today; 
    private String caseMatch; 
    private int spinnerField; 
    private Marking markSectionOne; 
    private Marking studentNumber; 
    private Marking markSectionTwo; 

    private MarkingService markingService; 

    private Marking markToEdit; 

    @Inject 
    private MarkingFacade markingFacade; 

    @PostConstruct 
    public void init() { 
     //this.markToEdit = this.markingFacade.find(studentNumber); 
     this.markSectionTwo = new Marking(); 
    } 

    public String markSectionTwo() { 
     this.markingFacade.edit(markSectionTwo); 
     this.setMessage("Mark Saved"); 
     markSectionTwo = new Marking(); 
     this.setMessage("Mark Saved"); 
     // now navigating to the next page 
     return "/lecturer/marking/marking-section-three"; 
    } 

    private void setMessage(String message) { 
     FacesContext fc = FacesContext.getCurrentInstance(); 
     fc.addMessage(null, new FacesMessage(message, "")); 
    } 

    public Marking getMarkSectionTwo() { 
     return markSectionTwo; 
    } 

    public void setMarkSectionTwo(Marking markSectionTwo) { 
     this.markSectionTwo = markSectionTwo; 
    } 

    public String getSearchString() { 
     return searchString; 
    } 

    public void setSearchString(String searchString) { 
     this.searchString = searchString; 
    } 

    public String getOrdering() { 
     return ordering; 
    } 

    public void setOrdering(String ordering) { 
     this.ordering = ordering; 
    } 

    public String getCriteria() { 
     return criteria; 
    } 

    public void setCriteria(String criteria) { 
     this.criteria = criteria; 
    } 

    public String getMatch() { 
     return match; 
    } 

    public void setMatch(String match) { 
     this.match = match; 
    } 

    public Date getToday() { 
     return today; 
    } 

    public void setToday(Date today) { 
     this.today = today; 
    } 

    public String getCaseMatch() { 
     return caseMatch; 
    } 

    public void setCaseMatch(String caseMatch) { 
     this.caseMatch = caseMatch; 
    } 

    public int getSpinnerField() { 
     return spinnerField; 
    } 

    public void setSpinnerField(int spinnerField) { 
     this.spinnerField = spinnerField; 
    } 

    public Marking getMarkSectionOne() { 
     return markSectionOne; 
    } 

    public void setMarkSectionOne(Marking markSectionOne) { 
     this.markSectionOne = markSectionOne; 
    } 

    public Marking getStudentNumber() { 
     return studentNumber; 
    } 

    public void setStudentNumber(Marking studentNumber) { 
     this.studentNumber = studentNumber; 
    } 

    public MarkingService getMarkingService() { 
     return markingService; 
    } 

    public void setMarkingService(MarkingService markingService) { 
     this.markingService = markingService; 
    } 

    public MarkingFacade getMarkingFacade() { 
     return markingFacade; 
    } 

    public void setMarkingFacade(MarkingFacade markingFacade) { 
     this.markingFacade = markingFacade; 
    } 

} 

, но в настоящее время только добавляет новую строку с данными в базе данных вместо того, чтобы пытаться объединить его с данными, уже содержащимися в базе данных для учащегося с определенным номером студента

как я могу это достичь? спасибо, ребята за вашу помощь :)

EDIT:

Я пробовал:

private Marking markToEdit; 

    @Inject 
    private MarkingFacade markingFacade; 

    @PostConstruct 
    public void init() { 
     this.markToEdit = this.markingFacade.find(studentNumber); 
     //this.markSectionTwo = new Marking(); 
    } 

    public String markSectionTwo() { 
     this.markingFacade.edit(markSectionTwo); 
     this.setMessage("Mark Saved"); 
     // markSectionTwo = new Marking(); 
     //this.setMessage("Mark Saved"); 
     // now navigating to the next page 
     return "/lecturer/marking/marking-section-three"; 
    } 

но получаю ошибку:

exception 

javax.servlet.ServletException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on [email protected] 
root cause 

org.jboss.weld.exceptions.WeldException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on [email protected] 
root cause 

java.lang.reflect.InvocationTargetException 
root cause 

javax.ejb.EJBException 
root cause 

java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation. 

ответ

1

я использую довольно подобный подход, как у вас, но с разными именами. Я отправлю его здесь, поэтому я думаю, что у вас может быть какая-то идея.

Мой путь - проверить объект явно, прежде чем слить его.

My JSF CRUD выглядит следующим образом

XHTML

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>DataSource Manager</title> 
</h:head> 
<h:body> 
    <h:form id="ds"> 

     <p:spacer height="10" /> 
     <p:fieldset legend="Insert/Edit Data Source"> 
     <p:panel id="insertUpdateForm"> 
     <h:panelGrid columns="2"> 

      <p:outputLabel for="name" value="Data Source Name:" style="width:100px;"/> 
      <p:inputText id="name" value="#{dataSourceMB.dataSource.name}"/> 


      <p:outputLabel for="user" value="User:" style="width:100px;"/> 
      <p:inputText id="user" value="#{dataSourceMB.dataSource.user}"/> 


      <p:outputLabel for="driver" value="Driver:" style="width:100px;"/> 
      <p:inputText id="driver" value="#{dataSourceMB.dataSource.driver}" /> 

     </h:panelGrid> 
     </p:panel> 

     <p:panel> 
      <p:commandButton value="Save" action="#{dataSourceMB.saveDataSource}" update="dsList,insertUpdateForm" /> 
      <p:commandButton value="Clear" action="#{dataSourceMB.clearDataSource}" update="insertUpdateForm" /> 
      <p:commandButton value="Test Connection" action="#{dataSourceMB.testConnection}"/> 
     </p:panel> 

     </p:fieldset> 


     <p:spacer height="10" /> 
     <p:fieldset legend="Data Sources">  
     <p:panel> 
      <p:dataTable 
       var="ds" 
       value="#{dataSourceMB.listDataSources}" 
       paginator="true" rows="10" 
       paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 
       rowsPerPageTemplate="10,50,100" 
       id="dsList"> 

      <p:column headerText="ID">     
       <h:outputText value="#{ds.id}" /> 
      </p:column> 
      <p:column headerText="Name">     
       <h:outputText value="#{ds.name}" /> 
      </p:column> 
      <p:column headerText="JDBC">     
       <h:outputText value="#{ds.jdbc} " /> 
      </p:column> 

      <!-- check http://jqueryui.com/themeroller/ for icons -->    

      <p:column headerText="" style="width:2%"> 
       <p:commandButton icon="ui-icon-pencil" action="#{dataSourceMB.editDataSource}" title="Edit" update=":ds:insertUpdateForm"> 
        <f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" /> 
       </p:commandButton> 
      </p:column>       
      <p:column headerText="" style="width:2%"> 
       <p:commandButton icon="ui-icon-trash" action="#{dataSourceMB.removeDataSource}" title="Remove" update=":ds:insertUpdateForm,dsList"> 
        <f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" /> 
       </p:commandButton>    
      </p:column> 
      </p:dataTable> 
     </p:panel> 
     </p:fieldset> 
    </h:form> 
</h:body> 
</html> 

управляемому боба

import java.io.Serializable; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import org.apache.log4j.Logger; 

import DataSourceEJB; 
import JSFUtilEJB; 
import DataSource; 

@ManagedBean 
@ViewScoped 
public class DataSourceMB implements Serializable { 

    private static final long serialVersionUID = 871363306742707990L; 
    private static Logger log = Logger.getLogger(DataSourceMB.class); 

    @EJB 
    private JSFUtilEJB jsfUtilEJB; 

    @EJB 
    private DataSourceEJB dataSourceEJB; 

    private DataSource dataSource; 
    private DataSource selectedDataSource; 
    private List<DataSource> listDataSources; 

    @PostConstruct 
    public void init() { 
     try { 
      this.dataSource = new DataSource(); 
      this.listDataSources = this.dataSourceEJB.listDataSources(); 
     } catch (Exception e) { 
      jsfUtilEJB.addErrorMessage(e,"Could not list"); 
     } 
    } 

    public void removeDataSource(){ 
     try { 
      this.dataSourceEJB.removeDataSource(this.selectedDataSource); 
      jsfUtilEJB.addInfoMessage("Removed "+this.selectedDataSource.getName()); 

      if (this.dataSource != null && this.dataSource.getId() != null && this.dataSource.getId().equals(this.selectedDataSource.getId())){ 
       this.dataSource = null; 
      } 
      this.listDataSources = this.dataSourceEJB.listDataSources(); 

     } catch (Exception e) { 
      jsfUtilEJB.addErrorMessage(e,"Could not remove"); 
     } 
    } 

    public void saveDataSource(){ 
     try { 
      this.dataSourceEJB.saveDataSource(this.dataSource); 
      jsfUtilEJB.addInfoMessage("Saved "+this.dataSource.getName()); 

      this.dataSource = new DataSource(); 
      this.listDataSources = this.dataSourceEJB.listDataSources(); 
     } catch (Exception e) { 
      jsfUtilEJB.addErrorMessage(e,"Could not save"); 
     } 
    } 

    public void editDataSource(){ 
     this.dataSource = this.selectedDataSource; 

    } 

    public void clearDataSource(){ 
     this.dataSource = new DataSource(); 
    } 

    public DataSource getDataSource() { 
     return dataSource; 
    } 

    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    public DataSource getSelectedDataSource() { 
     return selectedDataSource; 
    } 

    public void setSelectedDataSource(DataSource selectedDataSource) { 
     this.selectedDataSource = selectedDataSource; 
    } 

    public List<DataSource> getListDataSources() { 
     return listDataSources; 
    } 

    public void setListDataSources(List<DataSource> listDataSources) { 
     this.listDataSources = listDataSources; 
    } 

} 

мой EJB

import java.io.IOException; 
import java.sql.SQLException; 
import java.util.List; 

import javax.ejb.Stateless; 
import javax.inject.Inject; 

import DataSource; 

@Stateless 
public class DataSourceEJB { 

    @Inject 
    private BaseService baseService; 

    public List<DataSource> listDataSources() { 
     return this.baseService.getDataSourceDAO().getAll(); 
    } 


    public void removeDataSource(DataSource ds) throws Exception { 
     DataSource a = this.baseService.getDataSourceDAO().find(ds.getId()); 
     this.baseService.getDataSourceDAO().delete(a);  
    } 

    public void saveDataSource(DataSource ds) throws Exception { 
     DataSource a = this.baseService.getDataSourceDAO().find(ds.getId()); 
     if (a == null){ 
      this.baseService.getDataSourceDAO().add(ds); 
     }else{ 
      this.baseService.getDataSourceDAO().edit(ds); 
     }  
    } 

    public DataSource getById(long id) { 
     return this.baseService.getDataSourceDAO().find(id); 
    } 

    public DataSource getByName(String name) { 
     return this.baseService.getDataSourceDAO().findByName(name); 
    } 

} 

DAO

public E find(Long id) { 
    return (E)entityManager.find(clazz, id); 
} 

public void add(E entity) throws Exception { 
    entityManager.persist(entity); 
} 


public E edit(E entity) throws Exception { 
    return entityManager.merge(entity); 
} 


public void delete(E entity) throws Exception { 
    entityManager.remove(entity); 
} 
+0

спасибо за код, это его в EJB, где вы проверить до слияния?, Так как я не уверен, как ваш на самом деле работает – user2061913

+0

в методе saveDataSource() – Leo

+0

Спасибо, я пытался получить он работает над моим кодом, но до сих пор мне не повезло, вы думаете, что можете показать мне, как запустить его на моем примере, случайно? – user2061913

Смежные вопросы