2015-04-20 2 views
1

Я получаю следующую ошибку при использовании Spring MVC с hibernate Аннотации. Я пытаюсь вставить запись в базу данных, используя AUTO_INCREMENT в таблице базы данных mysql Employee. На классе модели у меня есть запись, как показано ниже -java.sql.SQLException: Нет значения для параметра

@Entity 
@Table(name="EMPLOYEES") 
public class Employee implements Serializable{ 

private static final long serialVersionUID = -1798070786993154676L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="emp_no") 
private int empNo=0; 

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

@Column(name="first_name") 
private String firstName; 

@Column(name="last_name") 
private String lastName; 

@Column(name="gender") 
@Enumerated(EnumType.STRING) 
private Gender gender=Gender.M; 

@Column(name="hire_date") 
private Date hireDate; 

public Employee() { 
    // TODO Auto-generated constructor stub 
} 

public int getEmpNo() { 
    return empNo; 
} 

public void setEmpNo(int empNo) { 
    this.empNo = empNo; 
} 

public Date getBirthDate() { 
    return birthDate; 
} 

public void setBirthDate(Date birthDate) { 
    this.birthDate = birthDate; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public Gender getGender() { 
    return gender; 
} 

public void setGender(Gender gender) { 
    this.gender = gender; 
} 

public Date getHireDate() { 
    return hireDate; 
} 

public void setHireDate(Date hireDate) { 
    this.hireDate = hireDate; 
} 

public String toString(){ 
    return "EmpNo ::::"+this.empNo+"Birth Date ::::"+this.birthDate 
      +"First Name ::::"+this.firstName+" Last Name::::"+ 
      this.lastName+" Hire Date ::::"+this.hireDate+" Gender::::"+this.gender; 
} 
} 

На стороне базы данных я определил столбец первичного типа, как показано ниже:

Field  Type   Null Key Extra 
emp_no  int(11)   NO PRI auto_increment 
birth_date date   YES   
first_name varchar(14)  YES   
last_name varchar(16)  YES   
GENDER  enum('M','F') YES   
hire_date date   YES   

метод addEmployee следующим образом:

@RequestMapping(value="/save",method=RequestMethod.POST) 
public ModelAndView saveEmployee(@ModelAttribute("command")EmployeeBean employeeBean,BindingResult bindingResult){ 
    Employee employee=prepareModel(employeeBean); 
    employeeService.addEmployee(employee); 
    Map<String, Object> model=new HashMap<String,Object>(); 
    model.put("employees", prepareListOfEmployeeBeans(employeeService.listEmployees())); 
    model.put("genders", employeeBean.getGender().values()); 
    return new ModelAndView("redirect:/add.html"); 
} 

public Employee prepareModel(EmployeeBean employeeBean) 
{ 
    if(employeeBean!=null){ 
     Employee employee=new Employee(); 
     employee.setFirstName(employeeBean.getFirstName()); 
     employee.setLastName(employeeBean.getLastName()); 
     employee.setGender(employeeBean.getGender()); 
     employee.setHireDate(employeeBean.getHireDate()); 
//   employee.setEmpNo(employeeBean.getEmpNo()); 
     employee.setBirthDate(employeeBean.getBirthDate()); 
//   employeeBean.setEmpNo(null); 
     return employee; 
    } 
    return null; 
} 

AddEmployee JSP:

<%@page import="org.springframework.web.servlet.ModelAndView"%> 
<%@page import="java.util.Map"%> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Add Employee Form</title> 
</head> 
<body> 
<form:form modelAttribute="command" action="/MVC_CRUD_SPRING/save.html" method="post"> 
    <table> 
     <tr> 
     <td colspan="2" align="center"><b>Add Employee Form</b></td>  
     </tr> 
     <tr> 
     <td><form:label path="empNo">Employee Number</form:label></td> 
     <td><form:input path="empNo" value="${employee.empNo}" readonly="true"/> </td> 
     </tr> 
     <tr> 
     <td><form:label path="birthDate">Birth Date</form:label> </td> 
     <td><form:input path="birthDate" value="${employee.birthDate}"/> </td> 
     </tr> 
     <tr> 
     <td><form:label path="firstName">First Name</form:label></td> 
     <td><form:input path="firstName" value="${employee.firstName}"/></td> 
     </tr> 
     <tr> 
     <td><form:label path="lastName">Last Name</form:label> </td> 
     <td><form:input path="lastName" value="${employee.lastName}"/> </td> 
     </tr> 
     <tr> 
     <td><form:label path="Gender">Gender</form:label></td> 
<%--   <td><form:radiobutton path="gender" value="M"/>Male &nbsp;&nbsp;&nbsp;&nbsp;<form:radiobutton path="gender" value="F"/>Female</td> - -%> 
     <td><form:radiobuttons path="gender" items="${genders}"/></td> 
     </tr> 
     <tr> 
     <td><form:label path="hireDate">Hire Date</form:label></td> 
     <td><form:input path="hireDate" value="${employee.hireDate}"/> </td>    
     </tr> 
     <tr> 
     <td colspan="2"> 
     <input type="submit" value="Submit"/> 
     </td> 
     </tr> 
    </table> 
</form:form> 
</body> 
</html> 

Стек ошибок трассировки:

Hibernate: insert into EMPLOYEES (birth_date, first_name, last_name, gender, hire_date, emp_no) values (?, ?, ?, ?, ?, ?) 
Apr 20, 2015 3:22:57 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [employee] in context with path [/MVC_CRUD_SPRING] threw exception [Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.cybage.projects.model.Employee]] with root cause 
java.sql.SQLException: No value specified for parameter 6 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2578) 

В приведенном выше фрагменте кода при создании модели работника я закомментирована employee.setEmpNo метод в prepareModel. Я думаю, что в качестве поля Employees в таблице emp_no есть автоинкремент. Мне не нужно явно устанавливать значение empNo, база данных должна позаботиться об этом. Если я раскомментирую это, тогда он также не работает.

Любой орган, который может помочь мне понять, где

+0

удалить прокомментированный код employee.setEmpNo и сделать приватным Long empNo; может быть, это решит проблему – Dev

+0

посетите http://stackoverflow.com/questions/4102449/how-to-annotate-mysql-autoincrement-field-with-jpa-annotations и http://stackoverflow.com/questions/20603638/ what-is-use-of-annotations-id-and-generatedvaluestrategy-generationtype для получения дополнительной информации – Dev

+0

На стороне БД. Поле emp_no - int (11), так что Long работает? .... Также есть две пронумерованные строки, линия которых вы просите меня раскомментировать? – GauravP

ответ

0
  1. Держите заявление employee.setEmpNo, как заметил сам, так как вы определяете генератор здесь.

  2. Нет необходимости инициализировать empNo нулевым значением. Посмотрите на this.

В приведенной выше ссылке четко указаны шаги, которые необходимо выполнить при использовании GenerationType.IDENTITY.

+0

Hi Misra проверит вас и сообщит вам – GauravP

+0

Я удалил инициализацию empNo из модели и bean-компонента, но все равно та же ошибка – GauravP

+0

Нулевое значение происходит от модели спящего режима до MySql. Ошибка «Нет значения, указанного для параметра» означает, что MySql ожидает некоторого значения, установленного в emp_no. Таким образом, MySQL не автоматически увеличивает значение emp_no MySQL, ожидая, что этот параметр не будет равен нулю. – GauravP

Смежные вопросы