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
|
|