繁体   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