2017-01-03 66 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 
相關問題