日期:2014-05-20  浏览次数:20751 次

hibernate多对一更新表异常的疑问???
这里有篇文章讲述用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 也应该报错呀?

------解决方案--------------------
为什么要用unique=true啊!这个好像在1对1基于外键的关联啊!
多对1
 多 1
 1的引用 Set<多>
我觉得是这样的映射方式吧!
 配置文件中 一个<many-to-one> 另一个 <set><key../<one-to-many.../></set> 吧!
  
而且 我们一般在 1的一方取消 关联管理 即 inverse=true,这样可以避免在没有擦入 主表的内容时 先擦入字表 带来的 外键字段的 null擦入 和 不必要的 update!
------解决方案--------------------
楼主你这样试一下,在这两个插入中间输出一下插入的p1关联的add1的id,看看在插了p1之后到底那个add1是不是已经插入了,然后再把后台输出出来的贴出来看一下,我太懒了,没试,嘿嘿……

代码如下:
Java code
  session.save(p1);
  System.out.println(p1.getAddress11fk().getId());
  session.save(add1);

------解决方案--------------------
缺级联