ssh框架下的关联表删除(级联删除)
来源:互联网 发布:上海专业seo 编辑:程序博客网 时间:2024/06/05 07:02
为了完善一个删除功能,期间遇到一些麻烦,希望记录下来,日后回头看会有所帮助,记一次成长,也是第一次写博客。
首先,页面方面使用的是dwz,我是初次接触而且刚开始工作不久,了解不是很深,但是一些功能的搭建是页面开发起来很方便,正如dwz介绍那样,省去开发人员写js的麻烦。
其次,本次项目使用的是SSH框架,我是新人,框架方面就此省略。网上有很多相关知识,框架的搭建,各部分的功能,业务逻辑配置等都很详细。
实现删除功能时,用的是底层自带的delete方法,所以相对于写新的del()底层delete让我作为了第一选择,但是关联表一开始没有配置,也不是我配置的,所以配置方面较晚发现,经验不足的表现,大局观不强。
下面附带一些知识吧,以备以后使用:
下边我们来看下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三种,顿时头脑发热感觉此路不通,心情很不爽……
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}
儿子中关系映射
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(原文作者:一念成执着)
就这样吧,以后可能会总结的更多更精华,写博客的习惯也会慢慢养成!