2017-01-03 64 views
0

我试图添加/更新学生,但在更新学生时出现错误。但在添加学生时,它可以正常工作。更新时出现此错误: -HTTP状态500 - 请求处理失败;嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行语句

HTTP状态500 - 请求处理失败;嵌套异常是org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [n/a];约束[null];嵌套的例外是org.hibernate.exception.ConstraintViolationException:无法执行语句

附加students.jsp

<form:form action="addStudent" enctype="multipart/form-data" modelAttribute="addstd" method="POST" > 
    <form:hidden path="id" /> 
    ${message} 
    <form:errors path="firstName" cssClass="error" /> 
    <form:input path="firstName" placeholder="Fistname" /> 

    <form:errors path="lastName" cssClass="error" /> 
    <form:input path="lastName" placeholder="Lastname" /> 

    <form:input path="contact_No" placeholder="Contact Number" /> 
    <form:input path="address" placeholder="Address" /> 

    <form:errors path="email" cssClass="error" /> 
    <form:input path="email" placeholder="Email" /> 

    <p class="msg"> 
     Year: 
    <form:select path="year"> 
      <c:forEach var="temp" items="${studentyear}"> 
      <form:option value="${temp.yearId}">${temp.year}</form:option> 
      </c:forEach> 
     </form:select> 

     Faculty: 
     <form:select path="faculty"> 
      <c:forEach var="temp" items="${studentfaculty}"> 
      <form:option value="${temp.faculty_id}" >${temp.faculty}</form:option> 
      </c:forEach> 
     </form:select> 
     Profile: <input type="file" name="image" accept="image/*" /> 

    </p> 
    <input type="submit" value="Add/Update Record" class="button" /> 
</form:form> 

@Controller类

@RequestMapping(value="/addStudent",method=RequestMethod.POST) 
public String saveStudent(@RequestParam("image") MultipartFile file,@RequestParam("id") int theId,@ModelAttribute("addstd") @Valid StudentInfo theStudent,BindingResult result,Model model){ 
    String fileName=null; 
    if(!file.isEmpty()){ 

     try { 
      String path= session.getServletContext().getRealPath("/resources/images"); 
      String newName=String.valueOf(new java.util.Date().getTime()); 
      fileName=file.getOriginalFilename(); 
      String ext=FilenameUtils.getExtension(fileName); 
      if(ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("jpeg") || ext.equalsIgnoreCase("png")){ 
      File imageFile=new File(path,newName+"."+ext); 
      file.transferTo(imageFile); 
      theStudent.setImages(newName+"."+ext); 

      if(theId!=0){ 
       StudentInfo std=studentService.getStudent(theId); 
       String images= std.getImages(); 
       File oldImage=new File(path,images); 
      Files.delete(oldImage.toPath()); 
      } 
      } 
     } catch (Exception e) { 

     } 
    } 
    if(result.hasErrors()){ 


    List <Year> theYear = studentService.getYear(); 
    model.addAttribute("studentyear",theYear); 

    List<Faculty> theFaculty=studentService.getFaculty(); 
    model.addAttribute("studentfaculty",theFaculty); 
     return "add-students"; 
    }else{ 
     studentService.saveStudent(theStudent); 
     return "redirect:/login"; 

     } 
} 

@RequestMapping("/showFormForUpdate") 
public String showUpdateStudent(@RequestParam("studentId") int theId, Model model){ 

    StudentInfo theStudent=studentService.getStudent(theId); 
    model.addAttribute("addstd",theStudent); 

    List <Year> theYear = studentService.getYear(); 
    model.addAttribute("studentyear",theYear); 

    List<Faculty> theFaculty=studentService.getFaculty(); 
    model.addAttribute("studentfaculty",theFaculty); 
    return "add-students"; 
} 

StudentDAOImpl.class

public void saveStudent(StudentInfo theStudent) { 
    Session currentSession=sessionFactory.getCurrentSession();  
    currentSession.saveOrUpdate(theStudent); 

} 

StudentInfo.class

@Entity 
@Table (name="studentinfo") 
public class StudentInfo implements Serializable { 

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


@Column(name="year_id") 
private int year; 


@Column(name="faculty_id") 
private int faculty; 

@NotEmpty(message="First Name cannot be empty") 
@Column(name="firstname") 
private String firstName; 

@NotEmpty(message="Last Name cannot be empty") 
@Column(name="lastname") 
private String lastName; 

@Column(name="contact_no") 
private String contact_No; 

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


@Email(message="Enter a valid email address") 
@Column(name="email") 
private String email; 


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

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name="ID") 
private User user; 

//getter and setter here 

User.class

@Entity 
@Table(name="user") 
public class User { 

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

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

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

@OneToOne(mappedBy = "user",fetch = FetchType.LAZY) 
private StudentInfo info; 

//getter and setter here 
+0

您是否看到数据库更新是否违反了某些数据库约束? –

+0

[什么是堆栈跟踪,以及如何使用它来调试我的应用程序错误?](http://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how - 可以 - 我使用的,它到调试我的应用程序,错误) – Raedwald

回答

0

在你StudentInfo类有一个字段:

private User user; 

您还没有映射的用户在表单控制器的任何领域。

你可以映射你的用户是这样的:

<form:hidden path="user.user_id"/> 

如果你想允许这个值为null然后在一到一个注解提供

nullable = true 

,也允许在空D b。

如果你在做添加学生,你没有用户可以为空,那么你将不得不以某种方式注入用户到你的控制器。

例如,在您的控制器方法中,当添加新的StudentInfo时从数据库获取用户信息,然后注入到studentInfo中。我写了如下的sudo代码:

// User user = session.get(User.class, 1); 
// studentInfo.setUser(user); 
// saveorUpdate studentInfo 
相关问题