ssh框架下的关联表删除(级联删除)

       为了完善一个删除功能,期间遇到一些麻烦,希望记录下来,日后回头看会有所帮助,记一次成长,也是第一次写博客。

      首先,页面方面使用的是dwz,我是初次接触而且刚开始工作不久,了解不是很深,但是一些功能的搭建是页面开发起来很方便,正如dwz介绍那样,省去开发人员写js的麻烦。

     其次,本次项目使用的是SSH框架,我是新人,框架方面就此省略。网上有很多相关知识,框架的搭建,各部分的功能,业务逻辑配置等都很详细。

     实现删除功能时,用的是底层自带的delete方法,所以相对于写新的del()底层delete让我作为了第一选择,但是关联表一开始没有配置,也不是我配置的,所以配置方面较晚发现,经验不足的表现,大局观不强。

    下面附带一些知识吧,以备以后使用:

ssh框架下的关联表删除(级联删除)_第1张图片

下边我们来看下cascade的取值:

Cascade属性的取值有:

1、none:忽略其他关联的对象,默认值。

2、save-update:当session通过save(),update(),saveOrUpdate()方法来保存或更新对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。

3、persist:当session通过persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。

4、merge:通过Session的merge()方法来保存当前对象时,会级联融合所有关联的游离对象。

5、delete:通过delete()删除当前对象时,会级联删除所有关联的对象。

6、lock:通过lock()把当前游离对象加入session缓存时,会把所有的游离对象也加入Session缓存中。

7、replicate:通过replicate()复制当前对象时,会级联复制所有关联的对象。

8、evict:通过evict()清除session缓存中对象时,会级联清除所有关联的对象。

9、refresh:通过refresh()刷新当前对象时,会级联刷新所有关联的对象。(刷新是指同步更新session缓存中数据)

10、all:save-update(),persist(),merge(),delete(),lock(),replicate(),evict()及refresh()的行为。

11、delete-orphan,删除所有和当前对象时,解除关联行为的对象。

12、all-delete-orphan; 通过delete()删除当前对象时,会级联删除所有关联的对象。


      再说一个比较坑的地方:我看到说把lazy改为true,坑的地方来了,项目中的lazy只有false、proxy、no-proxy三种,顿时头脑发热感觉此路不通,心情很不爽……

                                                                                                              ssh框架下的关联表删除(级联删除)_第2张图片

Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系。
  Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。按照原来的映射文 件,people.getAddresses().add(address),即主控方对象的状态发生了改变,因此数据库会跟着对象状态的变化来同步更新 数据库;而address.setPeople(people),即被控方对象的状态发生了改变,它是不能触发对象和数据库的同步更新的。

  举个最简单的一对多父子关系。那么代码就写成:


  父亲中的关系映射

{set name="children" lazy="true" inverse="true"}

      {key column="parent_id"/}

      {one-to-many class="test.Child"/}

{/set}

  儿子中关系映射


{many-to-one name="parent" column="parent_id" not-null="true"/}

Parent p = new Parent();


Child c = new Child();


c.setParent(p);  //维护父子之间关系


p.getChildren().add(c);


  session.save(p);


session.flush();


  注意:{many-to-one}总是设成“inverse=false”的,而且这个属性在Mapping中是不存在的!


  这样运行的下来的结果就是:


  Hibernate: insert into parent (id) values (?)


Hibernate: insert into child (parent_id, id) values (?, ?)


  那么假如c.setParent(p)注释掉,结果就是:


  Hibernate: insert into parent (id) values (?)


DWZ开发文档:http://www.yq1012.com/dwz/


SSH综合知识:https://www.cnblogs.com/hww123/p/5852086.html(原文作者:一念成执着)


就这样吧,以后可能会总结的更多更精华,写博客的习惯也会慢慢养成!







你可能感兴趣的:(ssh框架下的关联表删除(级联删除))