日期:2014-05-18  浏览次数:20713 次

hibernate 关联 关系 我非常疑惑
A 表 id(自增长) worknumber(pk) name 
   
B 表 id(自增长) worknumber(fk) card 

========================================================================= 
在A表这 设置了关联关系 

POJO A a 
里设置了 
B b; 
set b 方法 
get b 方法 
<many-to-one name="b" column="worknumber" property-ref="worknumber"(由于不是主键必须得设这个来指定 ,不设置就报错) not-null="true" 
  lazy="false" unique="true" /> 
这个设置好 worknumber 字段 必须 设置 update insert false 

B表 没有设 
====================================================================================== 
  A a = aDao.findAByWorkNumber(WorkNumber); 
  B b = a.getb(); 
  b.setworknumber (“123”) 
  bdao.update(b); 
a.setname(“xxx”); 
========================================================================================
这样 A表和 B表 2个字段的 worknumber 都会更新。 
当我把“a.setName ”注释掉 
只有B表的worknumber 更新了 A却没有。 
也就是说 只有当 A表的 其他字段也发生变化 的时候 A表的 WORKnumber才会跟着B表变化 
  这是为什么? 
  而且 我并没有 adao.update(a) 只要A表有字段发生变化 就会更新成功, 为什么? 
  大家是如何建表的  
  1 对 1的话 是不是 2个表都需要 自增长ID 
  1 对 多的话 在多方需要加自增长ID吗(为什么不可以直接用1方的主键 ) 
  多 对 多呢? 
  都是通过 2个多对已完成 来代替 设置2个set ? 


------解决方案--------------------
用myexlipse的反向工程啊!这样只要你把表建好,把他们的关系建好,直接用反向工程,代码都出来了.一般就没问题了!
------解决方案--------------------
myexlipse的反向工程
只有多对一的,没有多对多的哦.呵呵
------解决方案--------------------
在b 的一端设置inverse="true"
------解决方案--------------------
即由a端来维护关系,这样:
 A a = aDao.findAByWorkNumber(WorkNumber); 
B b = a.getb(); 
b.setworknumber (“123”) 
adao.update(a); 
试试!
------解决方案--------------------
A实体类的对象.外键属性.B实体类的属性,这样就不需要update insert false了