java - spring中如何使用一个函数保存多行数据

标签 java sql postgresql spring-mvc

我的 Controller 就像:

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;
}

当我使用此 Controller 时,我收到此错误..

HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException

类型异常报告

message Request processing failed; nested exception is java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is 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)

root cause

java.lang.NullPointerException com.stock_issuance.controller.Stock_issuance_controller.saveStock4(Stock_issuance_controller.java:118) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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 The full stack trace of the root cause is available in the Apache Tomcat/7.0.68 logs.

最佳答案

您可以像下面一样使用 hibernate 批处理。

在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();

关于java - spring中如何使用一个函数保存多行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53737216/

相关文章:

Java - DataOutputStream 的 writeLong 方法和写入十六进制

JavaFX CSS 应用于所有 ScrollPanes

mysql - 将新列作为外键添加到表中

postgresql - 将时钟列 postgresql 转换为日期和小时

java - C# Bouncy CaSTLe AES 解密 + GZ 解压缩 - 不同长度数据失败

java - 删除多个 if-else 的最佳方法

从数据库返回时的Php错误代码

java - 使用日期和时间创建日期时间

postgresql - 我如何知道我的 PostgreSQL 服务器是否使用 "C"语言环境?

PostgreSQL:查询没有结果数据的目的地