先是从注册页面获得数据,然后把它们保存在数据库中的两张表里(一张表不能保存注册页面所有的数据),两张表分别为TbUserinfo、TbMemberinfo,其中TbMemberinfo里有一个userId字段是要引用TbUserinfo里的,在注册功能的dao里,建立他们之间的关联关系,而且能够将从注册页面获得的数据打印出来,但是就是在保存时出了错,一直找不到是什么原因,所有想让各位帮帮忙看一下,到底是那个地方写错了!!!!   报错代码如下Hibernate: select tbmemberin_.N_USERID, tbmemberin_.N_GRADEID as N2_9_, tbmemberin_.N_TOTAL_CENT as N3_9_, tbmemberin_.V_PHOTO as V4_9_, tbmemberin_.V_SELFLABLE as V5_9_, tbmemberin_.D_BIRTHDAY as D6_9_, tbmemberin_.V_SEX as V7_9_, tbmemberin_.V_MAILBOX as V8_9_, tbmemberin_.V_ADDRESS as V9_9_, tbmemberin_.C_ID_USABLE as C10_9_, tbmemberin_.N_LOGIN_COUNT as N11_9_, tbmemberin_.N_VISIT_COUNT as N12_9_, tbmemberin_.N_USABLE_CENT as N13_9_, tbmemberin_.N_GOLD as N14_9_, tbmemberin_.D_LAST_LOGIN as D15_9_, tbmemberin_.D_REGISTER_TIME as D16_9_ from SCOTT.TB_MEMBERINFO tbmemberin_ where tbmemberin_.N_USERID=?
Hibernate: insert into SCOTT.TB_MEMBERINFO (N_GRADEID, N_TOTAL_CENT, V_PHOTO, V_SELFLABLE, D_BIRTHDAY, V_SEX, V_MAILBOX, V_ADDRESS, C_ID_USABLE, N_LOGIN_COUNT, N_VISIT_COUNT, N_USABLE_CENT, N_GOLD, D_LAST_LOGIN, D_REGISTER_TIME, N_USERID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
09  09-12-04 10:04:34,546 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 2291, SQLState: 23000
09  09-12-04 10:04:34,546 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] ORA-02291: 违反完整约束条件 (SCOTT.FK4CAC18B935B61226) - 未找到父项关键字09  09-12-04 10:04:34,546 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 2291, SQLState: 23000
09  09-12-04 10:04:34,546 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] ORA-02291: 违反完整约束条件 (SCOTT.FK4CAC18B935B61226) - 未找到父项关键字09  09-12-04 10:04:34,546 [org.hibernate.event.def.AbstractFlushingEventListener]-[ERROR] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:575)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy1.registerUser(Unknown Source)
at cn.com.video.action.UserAction.registerUser(UserAction.java:141)
       

解决方案 »

  1.   

    [ERROR] ORA-02291: 违反完整约束条件 (SCOTT.FK4CAC18B935B61226) - 未找到父项关键字
    先保存父表,后保存子表。
      

  2.   

    你的sql语句后面看不见啊你再贴一下啊
      

  3.   

    DAO 方法是这样的public int registerUser( POJO userinfo,POJO memberinfo)throws Exception{

    System.out.println("UserDao registerUser.....");

    TbUserinfo tbUserinfo = (TbUserinfo)userinfo;
    TbMemberinfo tbMemberinfos = (TbMemberinfo)memberinfo;
    System.out.println("username:" + tbUserinfo.getVUsername());
    System.out.println("password:" + tbUserinfo.getVPassword());
    System.out.println("mail:" + tbMemberinfos.getVMailbox());
    System.out.println("address:" + tbMemberinfos.getVAddress());
    System.out.println("sex:" + tbMemberinfos.getVSex());

    final Set memberInfo = new HashSet(0);
    memberInfo.add(tbMemberinfos);


    try{

    tbUserinfo.setTbMemberinfos(memberInfo);
    tbMemberinfos.setTbUserinfo(tbUserinfo);
    hibernateTemplate.save(tbUserinfo);
    hibernateTemplate.save(tbMemberinfos);

    } catch (Exception e){

    return 0;
    } return 1;
    }
      

  4.   

    刚错误信息有点出入,现在改一下,如下Hibernate: select seq_userid.nextval from dual
    Hibernate: select tbmemberin_.N_USERID, tbmemberin_.N_GRADEID as N2_9_, tbmemberin_.N_TOTAL_CENT as N3_9_, tbmemberin_.V_PHOTO as V4_9_, tbmemberin_.V_SELFLABLE as V5_9_, tbmemberin_.D_BIRTHDAY as D6_9_, tbmemberin_.V_SEX as V7_9_, tbmemberin_.V_MAILBOX as V8_9_, tbmemberin_.V_ADDRESS as V9_9_, tbmemberin_.C_ID_USABLE as C10_9_, tbmemberin_.N_LOGIN_COUNT as N11_9_, tbmemberin_.N_VISIT_COUNT as N12_9_, tbmemberin_.N_USABLE_CENT as N13_9_, tbmemberin_.N_GOLD as N14_9_, tbmemberin_.D_LAST_LOGIN as D15_9_, tbmemberin_.D_REGISTER_TIME as D16_9_ from SCOTT.TB_MEMBERINFO tbmemberin_ where tbmemberin_.N_USERID=?
    Hibernate: insert into SCOTT.TB_USERINFO (V_USERNAME, V_PASSWORD, N_FLAG, N_USERID) values (?, ?, ?, ?)
    Hibernate: insert into SCOTT.TB_MEMBERINFO (N_GRADEID, N_TOTAL_CENT, V_PHOTO, V_SELFLABLE, D_BIRTHDAY, V_SEX, V_MAILBOX, V_ADDRESS, C_ID_USABLE, N_LOGIN_COUNT, N_VISIT_COUNT, N_USABLE_CENT, N_GOLD, D_LAST_LOGIN, D_REGISTER_TIME, N_USERID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    09  09-12-04 10:29:48,015 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 2291, SQLState: 23000
    09  09-12-04 10:29:48,015 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] ORA-02291: 违反完整约束条件 (SCOTT.FK4CAC18B935B61226) - 未找到父项关键字09  09-12-04 10:29:48,015 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 2291, SQLState: 23000
    09  09-12-04 10:29:48,015 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] ORA-02291: 违反完整约束条件 (SCOTT.FK4CAC18B935B61226) - 未找到父项关键字09  09-12-04 10:29:48,015 [org.hibernate.event.def.AbstractFlushingEventListener]-[ERROR] Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:575)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy1.registerUser(Unknown Source)
    at cn.com.video.action.UserAction.registerUser(UserAction.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      

  5.   

    那怎样才能,先保存父表,然后保存子表啊,DAO里面的该怎么改,还恳请高手再指点指点!!!
      

  6.   

    不明白,我的是Struts2+Hibernate+Spring的工程,一些配置文件都配置好了,还要单独用事务去控制它吗???
      

  7.   

    那到不用    
    你试试  改 cascade
    或者你 父类表的关系是不是配置文件写错了啊
      

  8.   

    1楼正解,把两个save方法换一个位置
      

  9.   

    父表的配置文件我觉得应该没什么问题,关键是子表的那个主键生成策略,我觉得有点问题,我觉得应该通过外键的方式生成,下面是主键生成的配置代码块,你看一下有问题不<id name="NUserid" type="java.lang.Long">
                <column name="N_USERID" precision="10" scale="0" />
                <generator class="assigned"/>
            </id>
            <many-to-one name="tbUserinfo" class="cn.com.video.model.TbUserinfo" update="false" insert="false" fetch="select">
                <column name="N_USERID" precision="10" scale="0" not-null="true" unique="true" />
            </many-to-one>
      

  10.   

    你在2个save后面分别打印点东西看看
    是哪个SAVE出问题 在去从这个SAVE里找问题 你这样谁知道是你DAO方法有问题还是你本来SAVE的时候出了问题呢