当前位置: 代码迷 >> Java Web开发 >> 插入记录时出现ConstraintViolationException:could not insert 异常
  详细解决方案

插入记录时出现ConstraintViolationException:could not insert 异常

热度:603   发布时间:2010-09-17 17:01:38.0
插入记录时出现ConstraintViolationException:could not insert 异常
我用的是Hibernate3

在向数据库插入记录时,出现ConstraintViolationException:could not insert异常,但我检查了,要插入的数据满足所有的约束条件,而且向其他表插入记录都没有问题,就只这一个表有问题。

在hbm.xml中ID的配置如下:
程序代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
   
<hibernate-mapping package="pbc.bz.intendance.model">
   <class name="Intendance" table="t_intendance" >
      <!-- 映射标识属性 -->
      <id name="intendId" column="intend_id" type="java.lang.Integer">
         <generator class="identity" />
      </id>
     
      <!-- 下面映射其他普通属性 -->
      <property name="projectName" column="project_name" type="string" not-null="true" lazy="false" />
      <property name="checkDate"   column="check_date"   type="date"   not-null="true" lazy="false" />
      <property name="transactor"  column="transactor"   type="string" not-null="true" lazy="false" />
      <property name="beChecked"   column="be_checked"   type="string" not-null="true" lazy="false" />
      <property name="problemKind" column="problem_kind"  type="string" not-null="true" lazy="false" />
      <property name="problemDesc" column="problem_desc"  type="text"  not-null="true" lazy="false" />
      <property name="riskKind"    column="risk_kind"    type="string" not-null="true" lazy="false" />
      <property name="controllable" column="controllable"  type="text" not-null="true" lazy="false" />
      <property name="reason"      column="reason"       type="string" not-null="true" lazy="false" />
      <property name="behindDuty"  column="behind_duty"  type="string" not-null="true" lazy="false" />
     
      <!-- 映射该Intendance所关联的User: recorder/rechecker/assessor -->
      <many-to-one name="recorder" column="recorder" class="User" not-null="true" lazy="false" />
      <many-to-one name="rechecker" column="rechecker" class="User" lazy="false" />
      <many-to-one name="assessor" column="assessor" class="User" lazy="false" />
     
      <!-- 映射该Intendance关联的反馈信息Feedback -->
      <many-to-one name="back" column="back_id" class="Feedback" lazy="false" />
      <!-- 映射该Intendance所处的状态State -->
      <many-to-one name="stat" column="state_id" class="State" lazy="false"/>
     
     
      <!-- 配置监督信息Intendance与用户User的映射关系(修改关系--多对多) -->
      <set name="modifier" table="t_modification_of_intend" lazy="false" inverse="true">
         <key column="intend_id" />
         <one-to-many class="ModificationOfIntendance" />
      </set>
     
      <property name="submitDate" column="submit_date" type="timestamp" not-null="true" lazy="false" />

   </class>
</hibernate-mapping>
其中,rechecker, assessor, back三个属性可以为空,在插入之前,我将其设置为null.

添加监督信息的action函数:
程序代码:
// 说明,该action使用了模型驱动方式,即实现了com.opensymphony.xwork2.ModelDriven 接口。

// 添加监督信息
    public String addIntendance() throws Exception {
        Map session = ActionContext.getContext().getSession();
        String ver2 = (String)session.get("randomString");
        session.put("randomString", null);
      
        //
        if (vercode.equalsIgnoreCase(ver2)) {
           
            // 取得当前登录的用户信息
            User cu = (User)session.get("the_user");
            System.out.println("当前User ID: " + cu.getUserId());
           
            model.setRecorder(cu);
            model.setRechecker(null);
            model.setAssessor(null);
            model.setBack(null);
            model.setStat(mgr.getTheState(1));
            model.setSubmitDate(new Date());
           
            System.out.println("*********************");
            System.out.println(model.getStat().getStateId());
            System.out.println(model.getStat().getStateName());
            System.out.println(model.getStat().getStateDesc());
            System.out.println("*********************");
            System.out.println("*********************");
            System.out.println(model.getProjectName());
            System.out.println(model.getCheckDate());
            System.out.println(model.getTransactor());
            System.out.println(model.getBeChecked());
            System.out.println(model.getProblemKind());
            System.out.println(model.getProblemDesc());
            System.out.println(model.getRiskKind());
            System.out.println(model.getControllable());
            System.out.println(model.getReason());
            System.out.println(model.getBehindDuty());
            System.out.println(model.getRecorder().getUserId());
            System.out.println(model.getRechecker());
            System.out.println(model.getAssessor());
            System.out.println(model.getBack());
            System.out.println(model.getStat().getStateId());
            System.out.println(model.getSubmitDate());
           
            System.out.println("*********************");
           
            //return SUCCESS;
           
            if (mgr.addIntendance(model) > 0) {
                addActionMessage("成功添加监督信息!");
                System.out.println("执行到这里了...");
                return SUCCESS;
            }
            else {
                addActionError("添加监督信息失败,请重试!");
                return "failure";
            }
        }
        else {
            addActionError("验证码不匹配,请重新输入!");
            return "failure";
        }
    }
函数中System.out.println()输出的数据显示都满足数据库和配置文件的约束条件。

在struts.xml文件中的配置
程序代码:
      <!-- 添加监督信息 -->
      <action name="addIntendance"
              class="pbc.bz.intendance.action.IntendanceAction"
              method="addIntendance">
         <result name="input">/intend/addintend.jsp</result>
         <result name="failure">/intend/addintend.jsp</result>
         <result name="success">/users/welcome.jsp</result>
      </action>

每次在提交表单到addIntendance后,在TOMCAT的控制台都能看到要提交的每项数据,可就是在向数据库添加的时候出现ConstraintViolationException:could not insert 异常。

在网上找的情况都与我这里不一样,
有人说把<generator class="identity"/> 改为 <generator class="assigned"/>
我试了,还是不行。

请问有什么解决方法?

[ 本帖最后由 无缘今生 于 2010-9-18 14:38 编辑 ]
搜索更多相关主题的帖子: 记录  not  insert  

----------------解决方案--------------------------------------------------------
type是不是要写成java.lang.Integer或者int? 都试试 什么的数据库?如果是mysql 主键生成策略改成auto_increment看看
另外lz信息给都不够全 建议多给点信息
annotation用太多了 xml有点忘记怎么配置了

[ 本帖最后由 maxliz 于 2010-9-17 17:22 编辑 ]
----------------解决方案--------------------------------------------------------
搞忘说了,数据库是SQL Server 2005,至于type属性,我觉得应该没有问题,因为其他所有属性我都是这么设置的,都没有问题,就只是这个实体有问题。 约束我也检查了,要插入的数据都满足条件,就是一直报错。

另外,在Tomcat控制台,显示有Hibernate 的SQL语句,语句格式和语法都是正确的。
在建表的时候,设置user_id 为 identity primary key not null,整个表就再没有其他约束了。

[ 本帖最后由 无缘今生 于 2010-9-17 17:34 编辑 ]
----------------解决方案--------------------------------------------------------
饿 sqlserver都话 你贴出来都这些没问题
那你也要多贴点东西出来啊
就1个主键策略 能看出什么来

[ 本帖最后由 maxliz 于 2010-9-17 17:28 编辑 ]
----------------解决方案--------------------------------------------------------
刚刚把type属性改成java.lang.Integer后,还是一样的错误。

直接在数据库中可以正常插入,用同样的数据信息。

[ 本帖最后由 无缘今生 于 2010-9-17 17:36 编辑 ]
----------------解决方案--------------------------------------------------------
咋没人回复呢?
后来在网上看到有人说将id 的配置class改成native。
试了后还是一样的错误。

麻烦哪位知道原因,请告知, 急须解决此问题啊,不然后面的东西就没法做了啊!在此,先行谢过!
----------------解决方案--------------------------------------------------------
我记得出现无法插入错误的话,会报出具体的为什么无法插入错误信息啊...把那个贴出来看看...
如果无法确定错误就先把级联关系全部干掉,然后一点点找原因吧..
----------------解决方案--------------------------------------------------------
  相关解决方案