这里有篇文章讲述用unique=true多对一实现一对一关联的文章
多对一
文章后面测试
-------------------------------------------------------
2) :正常保存.
 
        session.save(p1);
        session.save(add1);Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)
Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)
Hibernate: update PERSON_11fk set name=?, age=?, addressId=? where personid=?4) : 发生异常,不能保存.
        session.save(p1);
//      session.save(add1);//注释掉
 
Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)
Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_fk.Address11fk
--------------------------------------------------------------疑问:
1. 针对2)中insert into PERSON_11fk (name, age, addressId) values (?, ?, ?),我认为这里的addressId因为Address11fk对象还没有被持久化,所以这里插入的addressId为null或初始值,等到Address11fk持久化后执行第三条update语句更新。我的理解正确吗?
2. 针对4)如果我上面的推断成立的话,为何4)会报错呢?如果要报错的话,2)中的第一条insert 也应该报错呀?

解决方案 »

  1.   

    为什么要用unique=true啊!这个好像在1对1基于外键的关联啊!
          多对1
     多               1
     1的引用        Set<多>
      我觉得是这样的映射方式吧!
     配置文件中 一个<many-to-one>  另一个 <set><key../<one-to-many.../></set> 吧!
      
      而且 我们一般在  1的一方取消 关联管理 即 inverse=true,这样可以避免在没有擦入 主表的内容时 先擦入字表 带来的 外键字段的 null擦入 和 不必要的 update!
      

  2.   

    用unique=true是以多对一实现一对一
    都没有正面回答我的问题呢?
      

  3.   

    楼主你这样试一下,在这两个插入中间输出一下插入的p1关联的add1的id,看看在插了p1之后到底那个add1是不是已经插入了,然后再把后台输出出来的贴出来看一下,我太懒了,没试,嘿嘿……代码如下:
      session.save(p1);
      System.out.println(p1.getAddress11fk().getId());
      session.save(add1);
      

  4.   

    针对2)中insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)
    此时的addressId值是什么?
      

  5.   

    你的p1和add1具体是神马东西?属性是什么值?
      

  6.   

    我的问题中有个链接,源代码再这个链接文章里
    http://lavasoft.blog.51cto.com/62575/39279