简体   繁体   中英

Deleting a row in integration of spring hibernate jsf

According to my previous question I can add the customer but i cannot delete a row. 在此处输入图片说明

How can I write the correct code for deleting the row?

I am using hibernate 4.1.4 and spring 3.1 and jsf 2.0 and maven 3 in eclipse.

Customermanagedbean.java

@ManagedBean(name="CustomerMB")
@RequestScoped
public class Customermanagedbean implements Serializable{
@ManagedProperty(value="#{CustomerBoImpl}")
ICustomerBo customerBoImpl;
List<Customer> CustomerList;
public int customerId;
public String name;
public String address;
public String createdDate;



public ICustomerBo getCustomerBoImpl() {
    return customerBoImpl;
}
public void setCustomerBoImpl(ICustomerBo customerBoImpl) {
    this.customerBoImpl = customerBoImpl;
}

public List<Customer> getCustomerList() {
    CustomerList=new ArrayList<Customer>();
    CustomerList.addAll(getCustomerBoImpl().findAllCustomer());

    return CustomerList;
}



public void setCustomerList(List<Customer> customerList) {
    CustomerList = customerList;
}
public int getCustomerId() {
    return customerId;
}
public void setCustomerId(int customerId) {
    this.customerId = customerId;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAddress() {
    return address;
}
public void setAddress(String address) {
    this.address = address;
}
public String getCreatedDate() {
    return createdDate;
}
public void setCreatedDate(String createdDate) {
    this.createdDate = createdDate;
}
//add a new customer data into database
public String addCustomer(){

    Customer cust = new Customer();
    cust.setCustomerId(getCustomerId());
    cust.setName(getName());
    cust.setAddress(getAddress());
cust.setCreatedDate(getCreatedDate());

    getCustomerBoImpl().addCustomer(cust);


    clearForm();

    return "";
}

//clear form values
private void clearForm(){
        setName("");
    setAddress("");
    setCreatedDate("");
}
public String deleteCustomer(Customer customer){
    getCustomerBoImpl().deleteCustomer(customer);

    return "";


}

}

CustomerDaoImpl.java

public class CustomerDaoImpl implements ICustomerDao{
    private SessionFactory sessionFactory;
    public SessionFactory getSessionFactory() {
        return sessionFactory;}
    public void setSessionFactory(SessionFactory sessionFactory) {
         this.sessionFactory = sessionFactory;
    }

    public void addCustomer(Customer customer){
        sessionFactory.openSession();
        getSessionFactory().getCurrentSession().save(customer);

    }

    public void updateCustomer(Customer customer){
        sessionFactory.openSession();
        getSessionFactory().getCurrentSession().update(customer);
    }

    public void deleteCustomer(Customer customer){
        sessionFactory.openSession();
        getSessionFactory().getCurrentSession().delete(customer);
    }


    public List<Customer> findAllCustomer(){
        sessionFactory.openSession();

        List list = getSessionFactory().getCurrentSession

().createQuery("from Customer").list();
        return list;

    }
}

CustomerBoImpl.java

@Transactional(readOnly = true)
public class CustomerBoImpl implements ICustomerBo{
 @Autowired
    ICustomerDao customerDaoImpl;



    public ICustomerDao getCustomerDaoImpl() {
        return customerDaoImpl;
    }

    public void setCustomerDaoImpl(ICustomerDao customerDaoImpl) {
        this.customerDaoImpl = customerDaoImpl;
    }

@Transactional(readOnly = false)
@Override
    public void addCustomer(Customer customer){

        getCustomerDaoImpl().addCustomer(customer);

    }

@Transactional(readOnly = false)
@Override
    public void updateCustomer(Customer customer){
        getCustomerDaoImpl().updateCustomer(customer);
    }

@Transactional(readOnly = false)
@Override
    public void deleteCustomer(Customer customer){
        getCustomerDaoImpl().deleteCustomer(customer);
    }

@Override
    public List<Customer> findAllCustomer(){

        return getCustomerDaoImpl().findAllCustomer();
    }
}

default.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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      >
    <h:head>
        <h:outputStylesheet library="css" name="table-style.css"  />
    </h:head>

    <h:body>



        <h:dataTable value="#{CustomerMB.getCustomerList()}" var="c"
                styleClass="order-table"
                headerClass="order-table-header"
                rowClasses="order-table-odd-row,order-table-even-row"
            >

            <h:column>
                <f:facet name="header">
                    Customer ID
                </f:facet>
                    #{c.customerId}
            </h:column>

            <h:column>
                <f:facet name="header">
                    Name
                </f:facet>
                    #{c.name}
            </h:column>

            <h:column>
                <f:facet name="header">
                    Address
                </f:facet>
                    #{c.address}
            </h:column>

            <h:column>
                <f:facet name="header">
                    Created Date
                </f:facet>
                    #{c.createdDate}

            </h:column>
             <h:column>

    <f:facet name="header">Action</f:facet>

    <h:commandButton value="Delete" action="#{CustomerMB.deleteCustomer(c)}" />

           </h:column>

        </h:dataTable>

        <h2>Add New Customer</h2>
        <h:form>

            <h:panelGrid columns="3">
                Customer ID : 
                <h:inputText id="customerId" value="#{CustomerMB.customerId}" 
                    size="20" required="true"
                    label="customerId" >
                </h:inputText>

                <h:message for="customerId" style="color:red" />
                Name : 
                <h:inputText id="name" value="#{CustomerMB.name}" 
                    size="20" required="true"
                    label="Name" >
                </h:inputText>

                <h:message for="name" style="color:red" />

                Address : 
                <h:inputTextarea id="address" value="#{CustomerMB.address}" 
                    cols="30" rows="10" required="true"
                    label="Address" >
                </h:inputTextarea>

                <h:message for="address" style="color:red" />

created Date : 
                <h:inputTextarea id="createdDate" value="#{CustomerMB.createdDate}" 
                    size="20" required="true"
                    label="createdDate" >
                </h:inputTextarea>

            </h:panelGrid>

            <h:commandButton value="Submit" action="#{CustomerMB.addCustomer()}" />

        </h:form>

    </h:body>

</html>

Make your bean @ViewScoped instead of @RequestScoped .

You can find a very thorough explanation of why in this article , but the reason it's not working it's because the data used for the h:dataTable is not preserved through the requests.

When your bean is @RequestScoped , each time you click a button that makes another request to the server, a new instance of the bean is created. And then, the value you binded as argument in the action for the delete commandButton does not exist anymore.

Making your bean @ViewScoped will keep it alive through the requests while you are in the same view (while you are postbacking to the same XHTML page). That way, the object used as the argument will still exist and the binding should work as expected.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM