簡體   English   中英

編寫器時休眠空指針異常

[英]hibernate null pointer exception at writer

我正在從事一個包含休眠的春季項目。 我經常遇到從數據庫獲取對象的問題,錯誤如下:

03-10-17 20:51:46 INFO  DsvrtLog - IncidenceController::New Incidence Reported rape
03-10-17 20:51:46 ERROR DsvrtLog - 
Report::Failed to get Object with ID : 1
[java.io.Writer.write(Writer.java:157)
 java.io.BufferedWriter.newLine(BufferedWriter.java:243)
 java.io.PrintStream.newLine(PrintStream.java:544)
java.io.PrintStream.println(PrintStream.java:807)
org.hibernate.hql.internal.ast.util.ASTPrinter.showAsString(ASTPrinter.java:100)
 org.hibernate.hql.internal.ast.QueryTranslatorImpl.showHqlAst(QueryTranslatorImpl.java:283)
 org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:274)
 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
 org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
 org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
 org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
 com.tivasgroups.apps.dsims.dao.DsimsDaoImpl.getObject(DsimsDaoImpl.java:108)
 com.tivasgroups.apps.dsims.service.ManageIncidenceImpl.saveIncidence(ManageIncidenceImpl.java:82)
 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 java.lang.reflect.Method.invoke(Method.java:606)
 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
 com.sun.proxy.$Proxy134.saveIncidence(Unknown Source)
 com.tivasgroups.apps.dsims.controller.IncidenceController.ManageIncidence(IncidenceController.java:318)
 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 java.lang.reflect.Method.invoke(Method.java:606)
 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509)
 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 java.lang.Thread.run(Thread.java:745)]

此錯誤在我的dao實現中出現:

<code>
    @Override
    public Object getObject(Class c,int id)throws DsvrtException {
        Transaction transaction = null;
        try{
            transaction = getOpenSession().beginTransaction();
            String sql = "FROM "+c.getName()+" C WHERE C.id = :id";
            Query q = getOpenSession().createQuery(sql);
            q.setParameter("id", id);
            List list = q.list();
            if(list.isEmpty())
                throw new NoResultException("No Result");
            transaction.commit();
            return list.get(0);
        }
        catch(HibernateException | NoResultException|NullPointerException e){
            if(transaction!=null)transaction.rollback();
            throw new DsvrtException(c,"Failed to get Object with ID : "+id+Arrays.toString(e.getStackTrace()));
        }
    }
</code>

我正在為配置使用注釋,而不是xml我有一個抽象的dao連接器

<code>
public abstract class AbstractDaoConnector {
    public  Class persistentClass;
    private org.hibernate.id.PersistentIdentifierGenerator PK;
    private static final ThreadLocal<Session> localThread = new ThreadLocal();
    @Autowired
    protected SessionFactory sessionFactory;
    protected Session getOpenSession()throws DsvrtException{
    Session session = localThread.get();
    if (session == null||!session.isOpen()) {
        if(sessionFactory==null)throw new DsvrtException(AbstractDaoConnector.class,"Session Factory is null");
      session = sessionFactory.openSession();
      localThread.set(session);
    }
    return session;
    }
    public  void closeSession() throws DsvrtException {
        try{
        Session session = (Session) localThread.get();
        localThread.set(null);
        if (session != null) {
            session.close();
        }
        }
        catch(HibernateException e){
            throw new DsvrtException(AbstractDaoConnector.class,"Failed to close Session");
        }
    }
    public void persist(Object object) throws DsvrtException{
        getOpenSession().persist(object);
    }
    public void delete(Entity entity) throws DsvrtException{
        getOpenSession().delete(entity);
    }
}
</code>

我會上傳代碼中有助於我解決問題的任何部分,謝謝

更新:

我似乎已經解決了通過將c.getName()更改為c.getSimpleName()以獲得類名的方法

奇怪!

您可以像這樣修改查詢並試一下嗎? 我在別名之前添加了“ AS”。 如果原來是問題,我會感到驚訝。

String sql = "FROM "+c.getName()+" AS C WHERE C.id = :id";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM