【问题标题】:how to save multiple row of data using one function in spring如何在spring中使用一个函数保存多行数据
【发布时间】:2019-05-13 05:10:09
【问题描述】:

我的控制器是这样的:

public ModelAndView postMethod(
        @ModelAttribute("attribute") ) throws Exception {
    ModelAndView mav = new ModelAndView("jsp");
    Date todayDate = new Date();
    Session session = null;
    Transaction transaction = null;
    if (issue_vendor.getOutward_item_code1() != null) {
        transaction = session.beginTransaction();
        session = sessionFactory.openSession();
        Query query = session.createQuery("FROM stock_register_dto where item_code=:code order by date desc");
        query.setInteger("code", issue_vendor.getOutward_item_code1());
        query.setMaxResults(1);
        List<stock_register_dto> list = query.list();
        System.out.println("result: " + list);
        for (stock_register_dto check : list) {
            Integer code1 = check.getItem_code();
            Integer stock1 = check.getStock();
            if (code1 == issue_vendor.getOutward_item_code1() && stock1 >= issue_vendor.getQuantity_issued1()) {
                this.master_service.saveRequirement(dto);
                session.flush();
                session.clear();
            }
        }
    }
    if (issue_vendor.getOutward_item_code2() != null) {

        transaction = session.beginTransaction();
        session = sessionFactory.openSession();
        Query query = session.createQuery("FROM stock_register_dto where item_code=:code order by date desc");
        query.setInteger("code", issue_vendor.getOutward_item_code2());
        query.setMaxResults(1);
        List<stock_register_dto> list = query.list();
        System.out.println("result: " + list);
        for (stock_register_dto check : list) {
            Integer code1 = check.getItem_code();
            Integer stock1 = check.getStock();
            if (code1 == issue_vendor.getOutward_item_code2() && stock1 >= issue_vendor.getQuantity_issued2()) {
                this.master_service.saveRequirement(dto);
                session.flush();
                session.clear();
            }
        }
    }
return mav;
}

当我使用这个控制器时,我得到了这个错误..

HTTP 状态 500 - 请求处理失败;嵌套异常是 java.lang.NullPointerException

输入异常报告

消息请求处理失败;嵌套异常是 java.lang.NullPointerException

描述服务器遇到阻止它的内部错误 完成此请求。

异常

org.springframework.web.util.NestedServletException: 请求 处理失败;嵌套异常是 java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

根本原因

java.lang.NullPointerException com.stock_issuance.controller.Stock_issuance_controller.saveStock4(Stock_issuance_controller.java:118) sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note 根本原因的完整堆栈跟踪可在 Apache Tomcat/7.0.68 日志。

【问题讨论】:

  • 做休眠批处理。

标签: java sql postgresql spring-mvc


【解决方案1】:

您可以使用如下所示的休眠批处理。

在hibernate配置文件中设置属性

hibernate.jdbc.batch_size 20

然后像下面的代码一样使用

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    stock_register_dto dto = new stock_register_dto (....);
    session.save(dto);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory the memory
        session.flush();
        session.clear();
    }
}

transaction.commit();
session.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多