【问题标题】:Spring hibernate annotation based master details data save errorSpring hibernate annotation based master details data save error
【发布时间】:2016-08-27 06:58:56
【问题描述】:

我是 Spring 框架的新手。我正在尝试在数据库中插入一个有一些人员的部门。我正在使用 spring-mvc 和 hibernate 来做到这一点。我正在关注这个链接来实现enter link description here 但我不是通过 sql 创建表。该表是在应用程序运行时创建的。我正在使用 postgres sql。有人可以帮我吗?以下是我的尝试>>>

我的部门实体类>>>

    @SuppressWarnings("deprecation")
@Entity
@Table(name="department")
public class Department {

    @Id
    @GeneratedValue
    @Column(name="department_id")
    private Long departmentId;

    @Column(name="department_name")
    private String departmentName;

    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="department_id")
    @IndexColumn(name="idx")
    private List<Personnel> personnels;

    public Long getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentId(Long departmentId) {
        this.departmentId = departmentId;
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public List<Personnel> getPersonnels() {
        return personnels;
    }

    public void setPersonnels(List<Personnel> personnels) {
        this.personnels = personnels;
    }

我的人事实体类>>>

    @Entity
@Table(name="personnel")
public class Personnel {

    @Id
    @GeneratedValue
    @Column(name="personnel_id")
    private Long personnelId;

    @Column(name="firstname")
    private String firstname;

    @Column(name="lastname")
    private String lastname;

    @Column(name="birth_date")
    private Date birthDate;

    @Column(name="cell_phone")
    private String cellphone;

    @ManyToOne
    @JoinColumn(name="department_id", 
                insertable=false, updatable=false, 
                nullable=false)
    private Department department; 

    @Column(name="idx")
    private Integer idx;

    public Personnel() {

    }

    public Personnel(String firstname, String lastname, String phone) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.birthDate = new Date(System.currentTimeMillis());
        this.cellphone = phone;
    }

}

我的控制器保存动作>>>

@RequestMapping(value = "/save", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public String save(HttpServletRequest request) {
    Map<String, String[]> department = request.getParameterMap();
    Map<String, String> data = departmentService.insert(department);
    System.out.println("######### >> Data Saved with id :: " + data.get("id"));
    return "redirect:/department/show/" + data.get("id");
}

我的服务插入操作 >>>

public Map<String, String> insert(Map<String, String[]> map) {
    Map<String, String> params = new HashMap<String, String>();
    Long id = null;
    Department department = new Department();
    department.setDepartmentName(map.get("departmentName")[0]);
    department.setPersonnels(new ArrayList<Personnel>());

    Personnel emp1 = new Personnel("Nina", "Mayers", "111");
    Personnel emp2 = new Personnel("Tony", "Almeida", "222");

    department.getPersonnels().add(emp1);
    department.getPersonnels().add(emp2);

    id = departmentDao.insertDoc(department);
    params.put("id", id.toString());
    return params ;

}

我的 dao insertDoc 操作 >>>

@Transactional
public Long insertDoc(Department doc) {
    Long id = (Long) sessionfactory.getCurrentSession().save(doc);
    sessionfactory.getCurrentSession().flush();
    return id;
}

最后我得到的错误>>>

    SEVERE: Servlet.service() for servlet [testSpring] in context with path [/testSpring] threw exception [Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
org.postgresql.util.PSQLException: ERROR: null value in column "department_id" violates not-null constraint
  Detail: Failing row contains (16, 2016-08-27, 111, Nina, null, Mayers, null).
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2921)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at com.stock.dao.DepartmentDao.insertDoc(DepartmentDao.java:23)
    at com.stock.dao.DepartmentDao$$FastClassBySpringCGLIB$$132caf1f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
    at com.stock.dao.DepartmentDao$$EnhancerBySpringCGLIB$$36cc6e45.insertDoc(<generated>)
    at com.stock.service.DepartmentService.insert(DepartmentService.java:34)
    at com.stock.controller.DepartmentController.save(DepartmentController.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

department_id 显示空值问题。但是任何人都可以请帮助如何用这个代码块解决它吗?

【问题讨论】:

    标签: spring postgresql hibernate spring-mvc


    【解决方案1】:

    您还需要在人事部门设置部门,其余的事情将由休眠处理。:

    例如:

    public Map<String, String> insert(Map<String, String[]> map) {
        Map<String, String> params = new HashMap<String, String>();
        Long id = null;
        Department department = new Department();
        department.setDepartmentName(map.get("departmentName")[0]);
        department.setPersonnels(new ArrayList<Personnel>());
    
        Personnel emp1 = new Personnel("Nina", "Mayers", "111");
        Personnel emp2 = new Personnel("Tony", "Almeida", "222");
    
    // Set Department in your emp1 and emp2 object 
        emp1.setDepartment(department);
        emp2.setDepartment(department);
    
        department.getPersonnels().add(emp1);
        department.getPersonnels().add(emp2);
    
        id = departmentDao.insertDoc(department);
        params.put("id", id.toString());
        return params ;
    
    }
    

    更改日志:

    // Set Department in your emp1 and emp2 object 
            emp1.setDepartment(department);
            emp2.setDepartment(department); 
    

    【讨论】:

      【解决方案2】:

      仔细阅读错误信息:

      错误:“department_id”列中的空值违反非空约束

      department 表中的 department_id 列有一个非空约束,当您尝试使用 Hibernate 插入以下实体时违反了该约束:

      Department department = new Department();
      department.setDepartmentName(map.get("departmentName")[0]);
      department.setPersonnels(new ArrayList<Personnel>());
      

      您从不分配 ID,它默认为 NULL,导致您看到的错误。要解决此问题,请在插入之前为部门分配一个非空 ID:

      department.setDepartmentId(1L);   // or any value you wish
      

      【讨论】:

      • 那它不会是一个静态值吗?我的意思是 - departmentId?!
      • 显然你需要把正确的 id 放在那里或者让它可以为空。一个人总是必须有一个部门 - 然后你必须提供一个 id - 或者没有。您不能宣布需要该部门,然后不提供。并且 insertable=false, updatable=false 也可能会干扰那里。
      • 我已经尝试了你的建议。但同样的错误。没有运气
      • @FlorianSchaetz 我只是按照博客的建议将主详细信息值保存在数据库中。但没有运气
      • 您是否在进行更改后重新构建并重新部署了代码?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多