【问题标题】:Can't insert to database using jsf and hibernate. Object return null无法使用 jsf 和休眠插入数据库。对象返回空
【发布时间】:2013-12-30 13:49:15
【问题描述】:

我的代码有关于向数据库插入新记录的问题。这是我的代码。希望有人建议我。

客户

public class Customer  implements java.io.Serializable {
     private int cusId;
     private String firstName;
     private String lastName;
     private String email;
     private Serializable dob;

    public Customer() {
    }

    public Customer(int cusId, String firstName, String lastName, String email, Serializable dob) {
       this.cusId = cusId;
       this.firstName = firstName;
       this.lastName = lastName;
       this.email = email;
       this.dob = dob;
    }

    public int getCusId() {
        return this.cusId;
    }

    public void setCusId(int cusId) {
        this.cusId = cusId;
    }
    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    public Serializable getDob() {
        return this.dob;
    }

    public void setDob(Serializable dob) {
        this.dob = dob;
    }
}

customerBean

@ManagedBean(name="customerBean")
@RequestScoped
public class customerBean implements Serializable {

    private Customer selectedCustomer;
    private List<Customer> customer;

    /** Creates a new instance of customerBean */
    public customerBean() {
        selectedCustomer = new Customer();
        customer = new ArrayList<Customer>();
    }

    public List<Customer> getCustomer() {
        CustomersDao cust_dao = new CustomersDao();
        customer = cust_dao.findAll();
        return customer;
    }

    public Customer getSelectedCustomer() {
        return selectedCustomer;
    }

    public void setSelectedCustomer(Customer selectedCustomer) {
        this.selectedCustomer = selectedCustomer;
    }

    public void btnCreate(){
        CustomersDao cust_create = new CustomersDao();
        String msg;
        if(cust_create.createCustomer(selectedCustomer)){
            msg = "Created Successfully!";
        }else{
            msg = "Error. Please check again!";
        }
        FacesMessage massage = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null);
        FacesContext.getCurrentInstance().addMessage(null, massage);
    }
}

CustomersDao

public class CustomersDao {
    public boolean createCustomer(Customer customer){
        boolean flag;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try{
            session.beginTransaction();
            session.save(customer);
            session.beginTransaction().commit();
            flag = true;
        }catch(Exception e){
            flag = false;
            session.beginTransaction().rollback();
        }
        return flag;
    }
}

xhtml

<p:growl id="msgs" showDetail="true" />
<h:form>
    <p:commandButton id="btnCreate" oncomplete="createDialog.show()" icon="ui-icon-search" title="Create" value="New Customer" update=":formCreate" />
</h:form>
<h:form id="formCreate">
    <p:dialog header="Create New Customer" widgetVar="createDialog" resizable="false" id="createDlg" showEffect="fade" hideEffect="explode">

        <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">

            <h:outputText value="First Name: " />
            <h:inputText value="#{customerBean.selectedCustomer.firstName}"/>

            <h:outputText value="Last Name: " />
            <h:inputText value="#{customerBean.selectedCustomer.lastName}" />

            <h:outputText value="DOB: " />
            <h:inputText value="#{customerBean.selectedCustomer.dob}" />

            <h:outputText value="Email: " />
            <h:inputText value="#{customerBean.selectedCustomer.email}" />

            <f:facet name="footer">
                <p:separator />
                <p:commandButton id="btnOK" oncomplete="createDialog.hide()" immediate="true" action="#{customerBean.btnCreate}" icon="ui-icon-search" title="Save" value="Save" update=":formData, :msgs" />
                <p:commandButton id="btnCancel" oncomplete="createDialog.hide()" icon="ui-icon-search" title="Cancel" value="Cancel" />
            </f:facet>
        </h:panelGrid>

    </p:dialog>
</h:form>

当我在调试模式下运行我的代码时,我输入的值(例如名字、姓氏、dob、电子邮件)返回 null。我尝试更改为 SessionScope 但没有任何改变。我正在使用 PrimesFace 3.5、Glassfish 3.1、Hibernate 和 JSF 2.0

【问题讨论】:

  • 我想你想把这个 immediate="true" 放在 CANCEL 按钮上,而不是放在 OK 按钮上。
  • @Gimby 现在我可以接收我输入的值但 custId 仍然是 0,custId 是身份字段,为什么会这样?
  • 因为您的数据库或客户实体的休眠配置有误。

标签: java hibernate jsf jsf-2 primefaces


【解决方案1】:

首先,immediate 属性在您的保存按钮中被滥用。只需删除它,让 JSF 生命周期以普通方式发生。

其次,您的取消按钮不会调用任何服务器端操作,因此通过切换到&lt;p:button&gt; 或在您的&lt;p:commandButton&gt; 上定义type="button" 让它成为一个普通的按钮。

最后,您开始三次新交易。从session.beginTransaction()session.getTransaction() 中删除第二次和第三次调用,否则您将破坏一个旧事务(而不是提交它)。

【讨论】:

  • 感谢您的支持。我删除了立即属性,我可以接收输入的值。但是当我使用调试模式检查时,cusId 仍然是 0,在 MySQL 中它是标识列,我有一条标识为 2 的记录,如果我插入数据库,它应该是 3。为什么会这样?
  • 请务必阅读瞬态、分离和持久实体状态之间的区别。您基本上是在尝试合并分离的实体,从而使其持久化,并且您似乎想要根据您的评论持久化一个瞬态实体。
  • 您为客户实例选择的前缀是 ambiguos。试着清楚地表达你想要达到的目标。似乎您正在粘贴代码的一部分,因此完整的上下文不清楚。除此之外,您对 JSF 原则的使用是错误的,并且您没有遵循 Java 命名约定。
  • 我的意思是 custId 是标识列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多