HTTP状态500 - 请求处理失败;嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行更新查询

时间:2014-07-02 07:51:16

标签: mysql spring jsp spring-mvc hibernate-annotations

嗨在我的春季mvc hibernate注释应用程序中,我有3个表员工团队平台。我正在使用下拉框选择Platform.jsp和Employee.jsp中的团队名称。当我尝试删除团队而不删除员工表和平台表中相应引用的引用时,我收到以下错误。

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute update query`

堆栈跟踪

type Exception report

message Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute update query

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 org.hibernate.exception.ConstraintViolationException: could not execute update query
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


root cause 

org.hibernate.exception.ConstraintViolationException: could not execute update query
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:84)
    org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:396)
    org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)
    org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141)
    org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
    com.resource.ResourceDao.DeviceDaoImpl.deleteDevice(DeviceDaoImpl.java:39)
    com.resource.ResourceService.DeviceServiceImpl.deleteDevice(DeviceServiceImpl.java:43)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:601)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy21.deleteDevice(Unknown Source)
    com.resource.ResourceController.DeviceController.deleteDevice(DeviceController.java:61)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:601)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


root cause 

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`employee`, CONSTRAINT `FK4AFD4ACE1BA063F9` FOREIGN KEY (`teamId`) REFERENCES `team` (`teamId`))
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
    com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
    org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:75)
    org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:396)
    org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)
    org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141)
    org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
    com.resource.ResourceDao.DeviceDaoImpl.deleteDevice(DeviceDaoImpl.java:39)
    com.resource.ResourceService.DeviceServiceImpl.deleteDevice(DeviceServiceImpl.java:43)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:601)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy21.deleteDevice(Unknown Source)
    com.resource.ResourceController.DeviceController.deleteDevice(DeviceController.java:61)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:601)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我的数据库 员工表

CREATE TABLE `Employee` (  `empId` int(11) NOT NULL,  
 `empName` varchar(255) DEFAULT NULL,  `empExp` int(11) NOT NULL, 
 `empTeam`      varchar(255) DEFAULT NULL, `teamId` int(11) DEFAULT NULL, 
  PRIMARY KEY (`empId`)),KEY `FK21` (`teamId`),  
CONSTRAINT `FK21` FOREIGN KEY (`teamId`) REFERENCES `Team` (`teamId`));

团队表

 CREATE TABLE `Team` (  `teamId` int(11) NOT NULL,  
    `teamName` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`teamId`));

平台表

CREATE TABLE `Platform` (  `pId` int(11) NOT NULL,  
  `Pname` varchar(255) DEFAULT NULL,`teamId` int(11) DEFAULT NULL,
PRIMARY KEY (`pId`),KEY `FK22` (`teamId`),  CONSTRAINT `FK22` FOREIGN KEY (`teamId`) REFERENCES `Team` (`teamId`));

Resource.java

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

    private static final long serialVersionUID = -723583058586873479L;

    @Id
    @Column(name="empid")
    private Integer empId;

    @Column(name="empname")
    private String empName;

    @Column(name="empexp")
    private Integer empExp;



    @Column(name="empteam")
    private String empTeam;

      @ManyToOne(cascade = CascadeType.ALL)
     @JoinColumn(name="teamId")
     private AddTeam teams;



    public Integer getEmpId(){
        return empId;
    }
    public void setEmpId(Integer empId){
        this.empId=empId;
    }


    public String getEmpName(){
        return empName;
    }
    public void setEmpName(String empName){
        this.empName=empName;
    }

    public Integer getEmpExp(){
        return empExp;
    }
    public void setEmpExp(Integer empExp){
        this.empExp=empExp;
    }



    public String getEmpTeam(){
        return empTeam;
    }
    public void setEmpTeam(String empTeam){
        this.empTeam=empTeam;
    }


    public AddTeam getTeams() {
          return teams;
         }

         public void setTeams(AddTeam teams) {
          this.teams = teams;
         }

}

AddTeam.java

@Entity
@Table(name="Team")

public class AddTeam {


    @Id
    @Column(name="teamId")



    private Integer teamId;

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

    public Integer getTeamId() {
          return teamId;
         }

         public void setTeamId(Integer teamId) {
          this.teamId = teamId;
         }

         public String getTeamName() {
          return teamName;
         }

         public void setTeamName(String teamName) {
          this.teamName = teamName;
         }
              }

Device.java

@Entity
@Table(name="Platform")
public class Device implements Serializable{

    private static final long serialVersionUID = -723583058586873479L;
    @Id
    @Column(name="pId")
    private Integer pId;

    @Column(name="Pname")
    private String pname;



     @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="teamId")
    private AddTeam teams;


    public Integer getpId(){
        return pId;
    }
    public void setpId(Integer pId){
        this.pId=pId;
    }


    public String getpname(){
        return pname;
    }
    public void setpname(String pname){
        this.pname=pname;
    }

    public AddTeam getTeams(){
        return teams;
    }
    public void setTeams(AddTeam teams){
        this.teams=teams;
    }
}

这是ResourceDaoImpl.java中使用的查询

@Override
    public void deleteResource(int resourceid) {
        // TODO Auto-generated method stub
        sessionfactory.getCurrentSession().createQuery("DELETE FROM Resource WHERE empid=" +resourceid).executeUpdate();

        }

用于在AddTeamDaoImpl.java中删除的查询

@Override
    public void deleteTeams(int teamid) {
        // TODO Auto-generated method stub
        sessiofactory.getCurrentSession().createQuery("DELETE FROM AddTeam WHERE teamid="+teamid).executeUpdate();

    }

用于删除DeviceDaoImpl.java的查询

@Override
    public void deleteDevice(int deviceid) {
        // TODO Auto-generated method stub
        sessionfactory.getCurrentSession().createQuery("DELETE FROM AddTeam WHERE teamid="+deviceid).executeUpdate();
    }

ResourceController.java中的deletefunction

@RequestMapping(value="/delete",method=RequestMethod.GET)
    public ModelAndView deleteResourceDetails(@ModelAttribute("command")  Resource resource,
            BindingResult result){
        resourceServices.deleteResource(resource.getEmpId());
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("resourcekey", resourceServices.listResources());
        model.put("teamKey", addteamServices.listTeams());
        return new  ModelAndView("EditTeam",model);
    }

删除DeviceController.java中的函数

@RequestMapping(value="/deletePlatform", method = RequestMethod.GET)
    public ModelAndView deleteDevice(@ModelAttribute("command") Device device, BindingResult result){
         deviceService.deleteDevice(device.getpId());
         Map<String, Object> model = new HashMap<String, Object>();
         model.put("platformKey", deviceService.listDevice());
         model.put("teamKey", teamservice.listTeams());
         return new ModelAndView("Device",model);
        }

EmployeeTeam.jsp

<%@ 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>Resource Manager</title>
</head>
<body>

<center>
<h2>Add Resources</h2>
<form:form method="POST" action="save.html">
<table>
  <tr>
    <td><form:label path="empId">Employee Id</form:label></td>
    <td><form:input path="empId" id="demo" value= "${resource.empId }"/></td>
  </tr>
  <tr>
    <td><form:label path="empName">Name</form:label></td>
    <td><form:input path="empName" value="${resource.empName }"/></td>
  </tr>

  <tr>
    <td><form:label path="empExp">Experience</form:label></td>
    <td><form:input path="empExp" value="${resource.empExp }"/></td>
  </tr>


   <tr>
    <td><form:label path="empTeam">Team</form:label></td>
    <td><form:input path="empTeam" value="${resource.empTeam}"/></td>
  </tr>


    <tr>
                    <td>
                        <form:label path="teams.teamId">Team Name</form:label>
                    </td>
                    <td>
                        <form:select path="teams.teamId" cssStyle="width: 150px;">    
                            <option value="-1">Select a type</option>
                            <c:forEach items="${teamKey}" var="teams">
                            <option value="${teams.teamId}">${teams.teamName}</option>
                            </c:forEach>
                        </form:select>
                    </td>
                </tr>
                <tr>


   <td colspan="2"><input type="submit"value="Submit"></td>

    </tr>

 </table>
 </form:form>
<br/>

 <c:if test="${!empty resourcekey}">
    <table align="center" border="1">
        <tr>
            <th> Emp ID</th>
            <th>Emp Name</th>
            <th>Emp Exp</th>
            <th>Emp Team</th>
            <th>Emp TeamNmae</th>
            <th>Emp skills</th>
            <th>Options</th>
        </tr>

        <c:forEach items="${resourcekey}" var="resource">
            <tr>
                <td><c:out value="${resource.empId}"/></td>
                <td><c:out value="${resource.empName}"/></td>
                <td><c:out value="${resource.empExp}"/></td>
                <td><c:out value="${resource.empTeam}"/></td>
                <td><c:out value="${resource.teams.teamName}"/></td>



                <td align="center"><a href="editPublication.html?empId=${resource.empId}">Edit</a> | <a href="deleteResource.html?empId=${resource.empId}">Delete</a></td>
            </tr>
        </c:forEach>
    </table>
</c:if>

    <h2><a href="addTeam.html">Adding Category</a></h2>
</center>
</body>
</html>

Team.jsp

<%@ 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>Emoloyee details</title>

<center>
<h2>Add Team Details</h2>
<form:form method="POST" action="Team.html">
   <table>
                <tr>
                    <td><form:label path="teamId">Team ID:</form:label></td>
                    <td><form:input path="teamId" id="demo" value="${team.teamId}"/></td>
                </tr>
                <tr>
                    <td><form:label path="teamName">Team Name:</form:label></td>
                    <td><form:input path="teamName" value="${team.teamName}"/></td>
                </tr>

                <tr>
                <tr>
                    <td>&nbsp;</td>
                  <td><input type="submit" value="SAVE"/></td>
                </tr>
            </table> 
        </form:form>
        <br/>
  <c:if test="${!empty teamKey}">
    <table align="center" border="1">
        <tr>
            <th>Category ID</th>
            <th>Category Name</th>
            <th>Options</th>
        </tr>

        <c:forEach items="${teamKey}" var="team">
            <tr>
                <td><c:out value="${team.teamId}"/></td>
                <td><c:out value="${team.teamName}"/></td>
                <td align="center"><a href="editTeam.html?teamId=${team.teamId}">Edit</a> |
                 <a href="deleteTeam.html?teamId=${team.teamId}">Delete</a></td>
            </tr>
        </c:forEach>
    </table>
</c:if>
<h2><a href="updateresource.html">Adding Publication</a></h2>


</center>



</body>
</html>

Platform.jsp

<%@ 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>Platform</title>
</head>
<body>

<form:form method="POST" action="savedevice.html">
<table>
 <tr>
   <td><form:label path="pId">Platform Id</form:label></td>
   <td><form:input path="pId" value="${platform.pId}"/></td>
 </tr>

 <tr>
   <td><form:label path="pname">Platform Name</form:label></td>
   <td><form:input path="pname" value="${platform.pname}"/></td>
 </tr>


 <tr>
   <td><form:label path="teams.teamId">Team Name</form:label></td>
   <td><form:select path="teams.teamId" cssStyle="width: 150px;">
             <option value="-1"> select Team</option>
             <c:forEach items="${teamKey}" var="teams">
             <option value="${teams.teamId}">${teams.teamName}</option>
             </c:forEach>
       </form:select>
       </td>
 </tr>

 <tr>
   <td colspan="2"><input type="submit"value="Submit"></td>

    </tr>
</table>


</form:form>
<c:if test="${!empty platformKey }">
  <table align="center" border="1">
   <tr>
    <th>Platform Id</th>
    <th>Platform Name</th>
    <th>Team Name</th>

   </tr>

       <c:forEach items="${platformKey}" var="platform">
        <tr>
          <td><c:out value="${platform.pId }"/></td>
          <td><c:out value="${platform.pname }"/></td>
          <td><c:out value="${platform.teams.teamName}"/></td>
          <td><a href="editPlatform.html?pId=${platform.pId}">Edit</a> | <a href="deletePlatform.html?pId=${platform.pId}">Delete</a></td>


        </tr>


       </c:forEach>


  </table>


</c:if>
</body>
</html>

请提前帮助

2 个答案:

答案 0 :(得分:0)

DeviceDaoImpl中的查询看起来不对:

"DELETE FROM AddTeam WHERE teamid="+deviceid

作为一般提示:您发布的堆栈跟踪可能会直接指导您解决问题。

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: ...
    ...
    com.resource.ResourceDao.DeviceDaoImpl.deleteDevice(DeviceDaoImpl.java:39)
    ...

答案 1 :(得分:0)

要解决此问题,应首先删除Parent:

http://www.baeldung.com/spring-dataIntegrityviolationexception