`
jianghengqiu
  • 浏览: 9820 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

教你如何打破多表关联的关系

J# 
阅读更多
   在多表关联的关系中,如果要删除其中一个表中的一条子数据,必定与这个表,这条数据有关联的数据也会被删除,但是这样的结果却不是我们要见到的。而我们要的效果是,1.删除子数据,父数据不被删除,与关联的表也不删除。2.删除父数据,而父数据下的子数据,孙子数据也会被删除,而与它关联的表也不删除。而怎样实现这样的结果呢,这就需要我们去打破他们之间的关系了。怎么打破呢,看下面的代码。

----这是一个个人空间中说说表say的删除代码-----------
发表一条说说,要知道发表说说的人,和回复说说的人,而这俩者都是一个user表里面的。
所以说,这个说说表say是跟用户表user是关联的,用户表跟说说表是一对多的关系。

      -------删除父说说------
@Transactional
public boolean deleteFatherSay(Integer sayId) {
Say say = sayDao.findById(sayId);   //获取"父节点"
Iterator<Say> iter = say.getSays().iterator(); //获取"父节点"下的"子节点",并存在迭代器里面
for (int i = 0; i < say.getSays().size(); i++) {//循环遍历每个"子节点"
Say say1 = iter.next();    //获取单个的子节点
Iterator<Say> iter1 = say1.getSays().iterator();  //获取单个"子节点"下"孙子节点",并存在迭代器里面
for (int j = 0; j < say1.getSays().size(); j++) {//循环遍历每个"孙子节点"
Say say2 = iter1.next();    //获取单个的孙子节点
say2.setUser(null);     //打破"孙子节点"与user的关联
say2.setSay(null);      //打破"孙子节点"与"子节点"的关系(删除"孙子节点"时,就不会把与"孙子节点"相关联的"子节点"也删除)
sayDao.delete(say2);   
}
say1.setSay(null);
say1.setUser(null);
sayDao.delete(say1);
}
say.setUser(null);
sayDao.delete(say);
return true;
}
      
    ----删除子说说----
@Transactional
public boolean deleteSonSay(Integer sayId) {
Say say = new Say();
say.setSayId(sayId);
String hql = "from Say as say1 where say1.say=" + sayId;
List<Say> list = sayDao.findByHql(hql);
Iterator<Say> iter = list.iterator();
for (int i = 0; i < list.size(); i++) {
Say say1 = iter.next();
say1.setUser(null);
say1.setSay(null);
sayDao.delete(say1);
}
say.setSay(null);
say.setUser(null);
say.setSays(null);
sayDao.delete(say);
return true;
}

      ---删除孙子说说---
@Transactional
public boolean deleteGrandsonSay(Integer sayId) {
Say say = sayDao.findById(sayId);
say.setSay(null);
say.setUser(null);
say.setSays(null);
sayDao.delete(say);
return true;



----------结论-----------
    如何打破他们的关系,就要知道一点,先打破下层关系,再打破上层的关系,这是自下而上来打破它们间的关系。
     父---子---孙子,(说说表say和用户表user有关联,所以say.setUser(null),这样就打破了和用户表之间的关联关系).

    1.删除孙子的说说,这要把上层的关系打破就行了say.setSay(null),这样删除孙子说说,就不会删除子说说和父说说。

     2.删除子说说(子说说是夹在父说说和孙子说说之间),还是按照自下而上的规则,先找出子说说的所有孙子说说,然后用for循环遍历每一个孙子说说,然后再打破孙子say.setSay(null);say.setUser(null);和上层的关系,最后删除孙子说说,然后子说说在打破和上层父说说的关系say.setSay(null);say.setUser(null);,最后删除子说说,那么子说说下的孙子说说也全部删除,而父说说则不会影响到。

     3.删除父说说,那么就要循环删除子说说和孙子说说,及要打破他们各自的关系。删除完父说说的子说说和孙子说说,最后再打破和用户表的关系say.setUser(null).这样就能删除父说说的同时也删除完他下面的说说,而不会影响到用户表user.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics