标题:插入记录时出现ConstraintViolationException:could not insert 异常
取消只看楼主
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
结帖率:100%
已结贴  问题点数:20 回复次数:3 
插入记录时出现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. 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 
2010-09-17 17:01
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
搞忘说了,数据库是SQL Server 2005,至于type属性,我觉得应该没有问题,因为其他所有属性我都是这么设置的,都没有问题,就只是这个实体有问题。 约束我也检查了,要插入的数据都满足条件,就是一直报错。

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

[ 本帖最后由 无缘今生 于 2010-9-17 17:34 编辑 ]

时不再来!!!
2010-09-17 17:23
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
刚刚把type属性改成java.lang.Integer后,还是一样的错误。

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

[ 本帖最后由 无缘今生 于 2010-9-17 17:36 编辑 ]

时不再来!!!
2010-09-17 17:35
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
咋没人回复呢?
后来在网上看到有人说将id 的配置class改成native。
试了后还是一样的错误。

麻烦哪位知道原因,请告知, 急须解决此问题啊,不然后面的东西就没法做了啊!在此,先行谢过!

时不再来!!!
2010-09-18 14:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-320725-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.126636 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved