for (Iterator iter = forms.iterator(); iter.hasNext(); ) {
      Workform form = (Workform)iter.next();
      System.out.println("form============"+form);
      session.save(form);
      Set refs = form.getFields(); //  是Workform.java的pojo类
      System.out.println("refs============"+refs);
      if (refs == null&refs.isEmpty())
      {这里我打印出来的
form============com.cyt.oa.workform.model.Workform@7ca9bd[id=<null>]
refs============null
java.lang.NullPointerException   出了个异常
为什么form 后面的 Id 会是null呢  refs的值怎么取不到?
workform.hbm.xml 里面是这么写的<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cyt.oa.workform.model">
<class name="Workform" table="workform">
<id column="id" name="id" type="java.lang.Long">
<generator class="native"/>
</id>
<property column="confine" name="confine" type="java.lang.Long"/>
<property column="name" name="name" type="string"/>
<property column="version" name="version" type="integer"/>
<property column="template" name="template" type="string"/>
<property column="title" name="title" type="string"/>
<property column="usable" name="usable" type="boolean"/>
<property column="isjunk" name="isjunk" type="boolean"/>
<property column="fld" name="fld" type="string"/>
<property column="cabeditflds" name="cabeditflds" type="string"/>
<property column="allflds" name="allflds" type="string"/>
<property column="formulas" name="formulas" type="string"/>
<property column="autowater" name="autoWater" type="string"/>
<property column="time" name="timestamp" type="java.util.Date"/>
<set name="fields" table="reference" inverse="true" lazy="true">
<key column="workformid"/>
<one-to-many class="com.cyt.oa.workform.model.Reference"/>
</set>
</class>
</hibernate-mapping>

解决方案 »

  1.   

    你用的id是自动增长的吧!
    当数据刚保存的时候,你不搜索数据库或返回ID,就直接取值,当然取不到值啦!
      

  2.   

      
          for (Iterator iter = forms.iterator(); iter.hasNext(); ) { 
          Workform form = (Workform)iter.next(); 
          System.out.println("form============"+form); 
          session.save(form); 
          Set refs = form.getFields(); //  是Workform.java的pojo类 
          System.out.println("refs============"+refs); 
          if (refs == null&refs.isEmpty()) 
          { //建议改成以下试试
    Iterator iter = forms.iterator(); 
    while(iter.hasNext()){
     Workform form = (Workform)iter.next(); 
          System.out.println("form============"+form); 
          session.save(form); 
          Set refs = form.getFields(); //  是Workform.java的pojo类 
          System.out.println("refs============"+refs); 
          if (refs == null&refs.isEmpty()) 
          { 
      

  3.   

    3L 我试了 不行  还是null
      

  4.   

    3L的写法还是和你一样的当然不行啦!
    你用的id是自动增长的吧!
    [color=#FF0000]当数据刚保存的时候,你不搜索数据库或返回ID,就直接取值,当然取不到值啦
    ![/color]
    还有一个就是用save()方法的时候,它不会立刻保存的数据库的,除非你 flush() 
      

  5.   

    添加一行看看!
    for (Iterator iter = forms.iterator(); iter.hasNext(); ) {
          Workform form = (Workform)iter.next();
          System.out.println("form============"+form);
          session.save(form);
          session.flush();
          Set refs = form.getFields(); //  是Workform.java的pojo类
          System.out.println("refs============"+refs);
          if (refs == null&refs.isEmpty())
          { 
      

  6.   

    for (Iterator iter = forms.iterator(); iter.hasNext(); ) {
          Workform form = (Workform)iter.next();
          System.out.println("form============"+form);
          session.save(form);
          session.flush();
          Set refs = form.getFields(); //  是Workform.java的pojo类
          System.out.println("refs============"+refs);
          if (refs == null&refs.isEmpty())
          { 
      

  7.   

     还是一样的,   其实 数据已经保存进去了,我每次运行一次, 在数据库中就会多一行记录  ,其实它运行的结果
    已经在数据里了,如果我刷新页面后,得到得结果是正确的 ,可是在后台就报了这个空指针错, 另外页面上
    也出了个窗口“org.hibernate.sessionException  session was already closed”
      

  8.   

    这个是那个页面的 js
    function issueCForm(){
    var ocx=getNestedOCX();
    var issued=ocx.issued;
    var modified=ocx.Modified;
    var changed=ocx.edited;

    var saveResult=true;
    var issueResult=false;
    try{
    if(changed) saveResult=(ocx.saveTable()==0);         //如果需要,则保存表单
    if(saveResult) issueResult=(ocx.issueTable()==0);    //保存成功,继续发布表单
     
    }catch(e){

    alert(e.message);    // 这里 出的那个hibernate异常  这里不是根本的原因,主要还是那个空指针
    return false;
    }
    if((changed && saveResult) || (issueResult && !issued)){

    if(issueResult && !issued){

    //页面跳转

    window.opener.allforms.submit();
    window.alert("表单启用成功!"); //modify by 
    self.close();

    }
    }
    return true;
    }
    }
      

  9.   

    应该拿到id了吧!你说的如果我刷新页面后,得到得结果是正确的 ,可是在后台就报了这个空指针错, 另外页面上
    也出了个窗口“org.hibernate.sessionException  session was already closed
    已经是另外的问题了,
    session was already closed 说明你把seesion关闭后又调用了session!
      

  10.   

    既然拿到了 为什么会是个Null,     还有在页面刷新的时候 它不是自动刷新跳转的,因为他出窗口后就没了反映了,必须我去刷新下重新打开后 正常
      

  11.   

    应该有异常吧,异常的详细信息呢?贴出来看看!建议你调debug,很容易就可以找出哪里出null异常了!
      

  12.   

    forms=============[com.cyt.oa.workform.model.Workform@1f75442[id=<null>]]
    form============com.cyt.oa.workform.model.Workform@1f75442[id=<null>]
    refs============null
    java.lang.NullPointerException
    at com.gardenia.deploy.DynamicDeployee.insertWorkform(DynamicDeployee.java:81)
    at com.gardenia.deploy.DynamicDeployee.deploy(DynamicDeployee.java:42)
    at com.gardenia.webservice.UploadClobHelper.uploadClob(UploadClobHelper.java:45)
    at com.gardenia.webservice.CFormServiceSoapBindingImpl.uploadClob(CFormServiceSoapBindingImpl.java:307)
    at com.gardenia.webservice.CFormServiceSoapBindingImpl.issueCustomForm(CFormServiceSoapBindingImpl.java:130)
    at com.gardenia.webservice.CFormServiceSoapBindingSkeleton.issueCustomForm(CFormServiceSoapBindingSkeleton.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
    at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
    at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453)
    at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
    at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
      

  13.   

    forms=============[com.cyt.oa.workform.model.Workform@1f75442[id= <null>]]
    form============com.cyt.oa.workform.model.Workform@1f75442[id= <null>]
    refs============null
    java.lang.NullPointerException
    at com.gardenia.deploy.DynamicDeployee.insertWorkform(DynamicDeployee.java:81)//DynamicDeployee.java:81行是什么东西啊
    at com.gardenia.deploy.DynamicDeployee.deploy(DynamicDeployee.java:42
    你有没有添加这个代码(session.flush(); ),如果添加了的话,id是可以拿到的,你可以打印出来!
    Set refs = form.getFields();取的是什么值??这个值你之前设置过没有的呢??怀疑这里才是问题所在!
      

  14.   

    if (refs == null&refs.isEmpty()) 
    你这个判断也有问题!如果refs 为null的话旧出异常了
      

  15.   

     com.gardenia.deploy.DynamicDeployee.insertWorkform(DynamicDeployee.java:81)//DynamicDeployee.java:81行是什么东西啊 
     这里就是 if (refs == null&refs.isEmpty())   这一行啊 
    Set refs = form.getFields(); 这里取的值
        public Set getFields()
        {
            return fields;
        }    public void setFields(Set fields)
        {
            this.fields = fields;
        }
    这里去设置的 
      

  16.   

    可以试一下排除法,先把:
    Set refs = form.getFields(); //  是Workform.java的pojo类 
          System.out.println("refs============"+refs); 
          if (refs == null&refs.isEmpty()) 
          { 
    这代码及后面都先去掉,只保留保存的代码,看会不会报异常,
    如果一步步排查,最终把问题找也来
      

  17.   

    重新部署了下  无意中好了,其实那里refs=====null 没有事,就是不知道为什么会出nullpointexception,我估计是有的地方泛型出的问题
      

  18.   

    if (refs == null&refs.isEmpty()) 当refs 为null的时候,refs.isEmpty()就抛空指针异常了