title: Getting a NPE while working with hibernate version column
body: <p>I am getting a NPE while trying to update a record. The entity class is annotated with @Version and the version column is not null with default(1) value. There are no records in the table with a null value in version field but still I am getting a NPE. Following is the error details:</p>
  
  <pre><code>Oct 23, 2013 9:00:51 PM com.sun.xml.ws.server.sei.EndpointMethodHandler invoke
  SEVERE: null
  java.lang.NullPointerException
      at org.hibernate.type.IntegerType.next(IntegerType.java:82)
      at org.hibernate.type.IntegerType.next(IntegerType.java:39)
      at org.hibernate.engine.Versioning.increment(Versioning.java:131)
      at org.hibernate.event.def.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:406)
      at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:296)
      at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:155)
      at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
      at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
      at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
      at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1261)
      at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
      at org.springframework.orm.hibernate3.HibernateTemplate$31.doInHibernate(HibernateTemplate.java:947)
      at org.springframework.orm.hibernate3.HibernateTemplate$31.doInHibernate(HibernateTemplate.java:1)
      at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
      at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
      at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedParam(HibernateTemplate.java:938)
      at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedParam(HibernateTemplate.java:929)
      at server.dao.PatientDAOImpl.updatePatient(PatientDAOImpl.java:158)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
      at com.sun.proxy.$Proxy30.updatePatient(Unknown Source)
      at server.service.PersistenceServiceImpl.updatePatient(PersistenceServiceImpl.java:125)
      at server.service.ServiceEndpoint.updatePatient(ServiceEndpoint.java:170)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
      at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
      at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
      at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:95)
      at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
      at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
      at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
      at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
      at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:295)
      at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:519)
      at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:288)
      at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:143)
      at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:155)
      at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:189)
      at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:76)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
      at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      at java.lang.Thread.run(Thread.java:722)
  </code></pre>
  
  <p>Note: I have updated a legacy db by adding version column, so has to get the optimistic locking feature of hibernate.</p>
  
  <p>DB change: </p>
  
  <pre><code>ALTER TABLE Patient ADD VERSION INT NOT NULL DEFAULT (1)
  GO
  </code></pre>
  
  <p>Entity class:</p>
  
  <pre><code>@Version
  @Column(name = "VERSION")
  private Integer version;
  </code></pre>
  
  <p>Code:</p>
  
  <pre><code>@SuppressWarnings("unchecked")
  @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  public Long updatePatient(Patient patient, String action) {
      Long patientId = patient.getId();
      long caseId = 0l;
      long siteId = 0l;
      long clientId = 0l;
      if (patientId == null) { // new Patient
          getHibernateTemplate().save(patient);
      } else if(action!=null &amp;&amp; action.equals("UPDATE")){
          getHibernateTemplate().update(patient);
          List&lt;Case&gt; caseList = getHibernateTemplate().findByNamedParam(
                  "select c from Case c where c.patient.id=:patientId and deleted=0", "patientId",patientId); // Line 158 - Error is raised here
          if(caseList!=null &amp;&amp; caseList.size()&gt;0){
             caseId = caseList.get(0).getId();
             siteId = caseList.get(0).getSiteId();
          }
          List&lt;Site&gt; site = getHibernateTemplate().findByNamedParam(
                  "from Site where id=:siteId", "siteId",siteId);
          if(site!=null &amp;&amp; site.size()&gt;0){
              clientId = site.get(0).getClientId();
          }
      }else if(action!=null &amp;&amp; action.equals("DELETE")){
          getHibernateTemplate().delete(patient);
      }
      return patientId;
  }
  </code></pre>