public static void main(String[] args) {
// TODO Auto-generated method stub
SessionFactory fac = HibernateSessionFactory.getSessionFactory();
Session session = fac.openSession();
session.beginTransaction();
Treetypeinfo ti = new Treetypeinfo();
ti.setTid(2);
//Treetypeinfo跟Tree是多对一关系
Tree t = new Tree();
t.setTreetypeinfo(ti);
t.setDisplayname("sfsd");
//TreeDa跟Tree是外键的1对1关系
TreeDa td = new TreeDa();
td.setTableName("test");
td.setTree(t);

t.setTreeDa(td);

session.save(t);
session.beginTransaction().commit();
session.close();
}我在Tree里面配置TreeDa是这样的<one-to-one name="treeDa" property-ref="tree" cascade="save-update"></one-to-one>然后运行报错:Hibernate: select 
             treecode
             .nextval from dual
Hibernate: select 
             treedacode
             .nextval from dual
Hibernate: insert into TREE (TID, displayname, rootcode, id) values (?, ?, ?, ?)
Hibernate: insert into treeda (tid, tableName, id) values (?, ?, ?)
Exception in thread "main" 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:202)
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:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.aisino.tree.test.Test.main(Test.java:31)
Caused by: java.sql.BatchUpdateException: ORA-02291: 违反完整约束条件 (TEST.引用TREE表) - 未找到父项关键字 at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10768)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
... 8 more
如果Tree插入成功假如他的id为1,但是在级联插入TreeDa的时候Tree的编号就变为2了,所以报错未找到父项关键字,就是外键引用报错,高手们求救啊,急!急!急!急!急!急!

解决方案 »

  1.   

    啊? 是我说的不明白吗?
    我尝试过用2个方法分别去保存,首先保存session.save(tree)保存成功那么就会产生主键吧?如果此时的主键是1的话,那么我再td.setTree(tree)这个时候再session.save(td),那么tree的id主键变成2了,就是这个问题不晓得怎么回事
      

  2.   

    干瞪眼,我guoxin,证明我来过!
    怎么感觉是sequence的问题?id自动增加了?
    个人感觉insert 的时候用sequence不当
      

  3.   

    主对象Tree配置成如下形式:<one-to-one name="treeDa" class="包名.类名" property-ref="tree" cascade="all"/>附属对象TreeDa配置成如下形式:<many-to-one name="tree" class="包名.类名" unique="true"/>之后save(tree)试试看。
      

  4.   

     不行 我就是那样配置的 好像你的那个
    <many-to-one name="tree" class="包名.类名" unique="true" column="tid"/>
    少个 column配置吧 
    这样保存 那么 TreeDa表的 Tid就是空值(引用Tree的外键 )
      

  5.   

    从你的代码看,你的关联应该是one-to-one的,而且是双向的
    那么你的表Tree和TreeData应该是双向关联的吧
    把你完整的hbm文件贴出来吧
      

  6.   


    <hibernate-mapping>
        <class name="TreeDa" table="treeda">
            <id name="id">
                <generator class="sequence">
                 <param name="sequence">
                 treedacode
                 </param>
                </generator>
            </id>
            <many-to-one name="tree" unique="true" class="Tree" column="tid"/>
            <property name="tableName"/>
        </class>
    </hibernate-mapping>
    <hibernate-mapping>
        <class name="Tree" table="TREE">
            <id name="id">
                <generator class="sequence">
                 <param name="sequence">
                 treecode
                 </param>
                </generator>
            </id>
            <many-to-one name="treetypeinfo" class="com.aision.tree.entity.Treetypeinfo">
                <column name="TID" />
            </many-to-one>
            <one-to-one name="treeDa" property-ref="tree" class="TreeDa" cascade="save-update"></one-to-one>
            <property name="displayname"/>
            <property name="rootcode"/>
            
        </class>
    </hibernate-mapping>配置文件贴出来了 ,包名我省略了
      

  7.   


    public static void main(String[] args) {
    // TODO Auto-generated method stub
     // TODO Auto-generated method stub
            SessionFactory fac = HibernateSessionFactory.getSessionFactory();
            Session session = fac.openSession();
            session.beginTransaction();
            Treetypeinfo ti = new Treetypeinfo();
            ti.setTid(2);
            //Treetypeinfo跟Tree是多对一关系
            Tree t = new Tree();
            t.setTreetypeinfo(ti);
            t.setDisplayname("sfsd");
            //TreeDa跟Tree是外键的1对1关系
            TreeDa td = new TreeDa();
            td.setTableName("test");
            
            t.setTreeDa(td);
            
            session.save(t);        session.beginTransaction().commit();
            session.close(); }配置文件如上,然后执行这代码,TreeDa表的Tid外键列的值为空,怎么回事呢?
      

  8.   

    让Treetypeinfo持有Tree对象 给他们两个建立关系 连关系都没有怎么能指望他们能保存
      

  9.   

    Treetypeinfo和tree配置了关系多对一,昨天晚上回去弄在自己电脑上可以了,今天考回公司又不行了,哎,不晓得怎么回事,11楼的意思是重新设置序列?我试下
      

  10.   

    我序列重新生成了,表的数据也清空了,还是那问题报上面的错好像是treetypeinfo 的原因
      

  11.   

    好像是Tree对象保存了2次,然后TreeDa对象保存的还是前次的Tid所以拿不到Tree的主键因为Tree的主键加1了,所以说违反完整约束条件 (TEST.引用TREE表) - 未找到父项关键