TA的每日心情  | 开心 2021-3-12 23:18 | 
|---|
 
  签到天数: 2 天 [LV.1]初来乍到  
 | 
 
| 
 
  
一,当由one方维护时(没有在one.hib.xml中设置inverse=true)的执行过程 
Hibernate: select qx0_.qxid as qxid1_0_, qx0_.qx as qx1_0_ from zf.dbo.TBL_QX qx0_ where qx0_.qxid=? 注:第一次查询 
Hibernate: select jd0_.jdid as jdid0_0_, jd0_.jd as jd0_0_, jd0_.qxid as qxid0_0_ from zf.dbo.TBL_JD jd0_ where jd0_.jdid=? 
Hibernate: select qx0_.qxid as qxid1_0_, qx0_.qx as qx1_0_ from zf.dbo.TBL_QX qx0_ where qx0_.qxid=? 
//准备更新jdid为8的数据 
Hibernate: update zf.dbo.TBL_JD set jd=?, qxid=? where jdid=? 
//先将所有jdid为8且qxid=1的数据的qxid设置为null 
Hibernate: update zf.dbo.TBL_JD set qxid=null where qxid=? 
//然后修改jdid为8的qxid为1,(此时暴露问题,jdid不是8的,但是qxid为1的数据的qxid都变为了null) 
Hibernate: update zf.dbo.TBL_JD set qxid=? where jdid=? 
此过程会将qxid为2的一条数据的qxid改为qxid为1 
但是所有的qxdi为1的数据的qxid都会变为null(因为qxid可以为空) 
  
二,当由多方维护时(即在一方设置了inverse=true)的执行过程 
Hibernate: select qx0_.qxid as qxid1_0_, qx0_.qx as qx1_0_ from zf.dbo.TBL_QX qx0_ where qx0_.qxid=? 
Hibernate: select jd0_.jdid as jdid0_0_, jd0_.jd as jd0_0_, jd0_.qxid as qxid0_0_ from zf.dbo.TBL_JD jd0_ where jd0_.jdid=? 
Hibernate: select qx0_.qxid as qxid1_0_, qx0_.qx as qx1_0_ from zf.dbo.TBL_QX qx0_ where qx0_.qxid=? 
//直接将jdid为8的数据中的qxid改为id为1的Qx表中的id 
Hibernate: update zf.dbo.TBL_JD set jd=?, qxid=? where jdid=? 
  
源码: 
  Session session = HibernateSessionFactory.getSession(); 
  Transaction tx = session.beginTransaction(); 
   
  //下面为将id为8,qxid为2,改为qxid为1的一方, 
  Qx qx = (Qx)session.get(Qx.class,1);//首先从数据库中查询一条Qx记录 
  Jd jd = (Jd)session.get(Jd.class, 8);//在从数据库中查询一条Jd记录,qxid为2 
   
  jd.setQx(qx);//先建立关于Jd和Qx的多对一关系 
  Set<Jd> jds = new HashSet<Jd>(); 
  jds.add(jd); 
  qx.setJds(jds);//再建立关于Qx和Jd的一对多关系 
  tx.commit(); 
  session.close(); 
  
总结: 
在使用Hibernate修改数据时,还是将维护权交给多方处理比较好,不然的话,所有的多方数据的外键都会变为null 
  
 |   
 
 
 
 |