关于JSF/PF+Hibernate+JPA(web开发中)数据的添加,更新,以及界面数据显示小结(图片待传)

本文总结了使用JSF/PF、Hibernate和JPA在web开发中进行数据添加、更新及界面显示的操作。通过JPA接口与界面交互,实现数据查询、新纪录添加、列表展示,并讨论了数据完整性问题及其解决方案,包括实体类和界面显示类的设计。
摘要由CSDN通过智能技术生成

一.完成功能:

    a. 通过JPA 接口读出数据,在web页面显示,然后修改后更新到数据库.

    b.在web页面 添加新纪录到数据库.

    c.列表中既显示主表数据,同时显示分表数据.

    界面示意图如下:(待传)


二.实现细节:

(1)xhtml文件(test.xhtml):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.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"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <f:view contentType="text/html">
        <h:head>
            <f:facet name="first">
                <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
                <title>I示例</title>
            </f:facet>
        </h:head>

        <h:body>

<h:form id="qryForm">

      <h:outputLabel for="projectNo" value="B-名字"/>

     <p:inputText  value="#{mngBean.bname}"  />

    <p:commandButton  value="查询"  actionListener="#{mngBean.query()}" update=":qryForm:mainTable :testform"/>



      <p:dataTable  id="mainTable" selectionMode="single"   selection="#{mngBean.testDataJSFRow}"     rowKey="#{test.b.id}" var="test" value="#{mngBean.testDataJSFList}" >

                                   <p:ajax event="rowSelect"  update=":editform"   />
                                    <p:column headerText="A-名字" >
                                        <h:outputText   value="#{test.a.name}"/>
                                    </p:column>
                                    <p:column headerText="B-名字">
                                        <h:outputText value="#{test.b.name}"/>
                                    </p:column>
                                    <p:column headerText="B-备注" >
                                        <h:outputText value="#{test.b.remark}"/>                                            
                                    </p:column>
       </p:dataTable>

</h:form>

<h:form id="editform">

<h:panelGrid  columns="2" >

                                    <p:outputLabel  value="A-名字:" />
                                   <p:inputText  value="#{mngBean.testDataJSFRow.a.name}"  />

                                  <p:outputLabel  value="B-名字:" />
                                   <p:inputText  value="#{mngBean.testDataJSFRow.b.name}"  />

                                   <p:outputLabel  value="B-备注:" />
                                   <p:inputText  value="#{mngBean.testDataJSFRow.b.remark}"  />

</h:panelGrid>

<h:panelGrid  columns="2" >

                  <p:commandButton value="添加" update=":editform" actionListener="#{mngBean.newRecord()}" >
                   </p:commandButton>
                   <p:commandButton value="提交"  update=":qryForm:mainTable :editform" actionListener="#{mngBean.submit()}" >
                   </p:commandButton>

</h:panelGrid>

</h:form>
        </h:body>
    </f:view>
</html>


(2)管理bean(mngBean.java):

@ManagedBean
@ViewScoped
public class OrderMngBean implements Serializable {

        @ManagedProperty(value = "#{testPrv}")
      private ITestPrv testPrv;


      private String bname;

      private testDataJSF testDataJSFRow = new testDataJSF();

      private   List testDataJSFList=new ArrayList();

    

      public void query(){

      //查询方法(略)

     }

     public void newRecord(){

         testDataJSFRow = new testDataJSF();

         testDataJSFRow.setA(new A());

         testDataJSFRow.setB(new B());

    }  

    public void submit(){

       testPrv.save(testDataJSFRow);//此处save可完成更新和添加新数据的功能(有id时为更新,无id时为添加新数据)

    }

   

    public String getBname() {
        return bname;
    }

    public void setBname(String bname) {
        this.bname =bname;
    }

    public testDataJSF getTestDataJSFRow() {
        return testDataJSFRow;
    }

    public void setTestDataJSFRow(testDataJSF testDataJSFRow) {
        this.testDataJSFRow =testDataJSFRow;
    }

     public List getTestDataJSFList() {
        return testDataJSFList;
    }

    public void setTestDataJSFList(List testDataJSFList) {
        this.testDataJSFList = testDataJSFList;
    }

  

      public ITestPrv getTestPrv() {
        return testPrv;
    }

    public void setTestPrv(ITestPrv testPrv) {
        this.testPrv=testPrv;
    }

}


(3)界面显示类:

public class TestDataJSF {
   
    private A a=new A();
   private B b=new B();

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }

   public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b= b;
    }
            
}

(4)entity(实体类):

类A:

@Entity
@Table(name = "a")
@XmlRootElement
@NamedQueries({
   ............  

})
public class A implements Serializable {
   
    @Column(name = "id")
    private Integer Id;
    @Column(name = "name")
    private String name;
  

.......

}


类B:

@Entity
@Table(name = "b")
@XmlRootElement
@NamedQueries({
   ............  

})
public class B implements Serializable {
   
    @Column(name = "id")
    private Integer Id;
    @Column(name = "name")
    private String name;

@Column(name = "remark")
    private String remark;
  

.......

}


三.问题与总结:

(1)使用save()方法更新数据到数据库出现的空指针和数据错误问题:

原因与解决:当使用save()更新数据时,确保被更新的数据完整性,如果被更新的entity有属性为class类型,如果此class类型的属性为null,则更新时将出现NullException的报错;之所以出现数据错误,是因为被更新的数据的一些简单属性(非class类型)数据不全,更新后,当前的不完整的数据覆盖了数据库中的数据.

(2)使用save()方法添加新数据到数据库出现空指针和无任何操作执行问题:

原因与解决:出现空指针的原因同上,出现无操作的原因是在插入数据之前,将新数据对象的id做了操作.正确的做法是,插入时new 一个对象,为此对象设置完整属性值(id的值不要动).

(3)实体类在界面显示时,界面显示类的设置问题.

解决:因为实体类是我们对数据库操作时传入接口的对象,需要保证数据的完整性,所以,为了减少更新中的赋值操作,在定义界面显示类时,直接将实体类作为界面显示类的属性,可以减少些麻烦.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值