因为你的session.save(user);表示由user主动方插入,然后再级联插入TPasspo,而你TUser的ID字段上建外键关联到TPasspo的ID时,由于表示TPasspo为主动方,那么插入USER时由于TPasspo没插入所以不能确定起USER的ID,反过来在TPasspo的ID建外键关联到TUser的ID上由于USER为主动方,所以插入USER后再级联插入TPasspo,就能确定TPasspo所关联到USER上的ID(也即自己的主健ID)

解决方案 »

  1.   

    如果只有一个一对一关系时,加上cascade="all"的好处是: 
    删除时只要delete一次,但是如果有多个一对一关系,delete一次只能删除parentPO和一项所对应的对象,而在删除其它对应项时,parentPO已经被删掉了,程序运行会出错。
      

  2.   

    一对多/多对一的关联维护在实际项目中使用是比较多的,在Hibernate中可采用多种方式来配置一对多的关联,如采用Set、List、Bag、Map等,具体在《Hibernate Reference》中都有详细说明。 
    关于inverse的设置,在一对多的情况下建议将一端的inverse设为true,而由多端去自动维护关联关系,为什么这样做其实挺容易理解的,假设org和user为一对多的关联,org.getUsers的inverse设置为false,org.getUsers().add(user);dao.update(org);当update的时候org所关联的所有user的orgId都会更新一次,可想而知这个效率,而如果改为在多端维护(多端设置为inverse=false),则是这样:user.setOrg(org);dao.update(user);当update的时候就仅仅是更新user这一条记录而已。 
      

  3.   

    多谢楼上的了,我也以为是这样的。
    不知道你看过没看过《深入浅出Hibernate》(夏昕编写的那本),他书上有个例子(书上的146页),跟我基本一样,害死一大批人啊,网上好多根据这个写的东西(比如:http://www.blogjava.net/myblog/archive/2006/07/05/56768.html)看来真是:尽信书不如无书!
      

  4.   

    还有其实:
    <one-to-one 
    name="TUser"
    class="com.jingxl.hib.pojo.TUser"
    constrained="true"
    />
    的constrained="true"表示你的TPasspo主键做为外键参照TUser主键,而你在表里TUser的ID字段上建外键关联到TPasspo的ID时这样就反了,违反了你定义的XML里对其的定义
      

  5.   

    to zhh1981(**的猪头)
    按照你的说法,是应该在TPasspo表的ID字段上建外键关联到TUser的ID字段才是正确的吧???
    如果是的话,我马上个作者发个email!!
      

  6.   

    是啊,呵呵,或者改下配置或SAVE方法
      

  7.   

    to zhh1981(**的猪头) 
    你有QQ吗?还想问几个问题。能不能加我的QQ,30397825!
      

  8.   

    楼主这种对待看书的态度是可取的,更可取的是把问题的过程贴出来与大家分享,支持噢!我用hibernate都是放到appfuse里的
      

  9.   

    to djpsunday(创业从此开始,) 
    光看不做肯定是不行的,至少也要把书上的例子调试过关才行^_^
    做到这个的时候怎么调试也不行,而且网上的例子基本上也一样,都是从TUser的ID字段上建外键关联到TPasspo的ID,自己也搞不明白,就来这里请教高人了!