Hibernate 单项级联操作
2016-09-20 19:03
393 查看
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "src/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.sanmao.utils.Classes"> <id name="cid" length="5"> <generator class="identity"></generator> </id> <property name="name" length="20"></property> <property name="description" length="20"></property> <!--set 是一个集合--> <!--name是属性名称 cascade 级联 在保存或者更新classes的时候,对Student进行操作 --> <!--inverse不写入主键--> <set name="stduents" cascade="save-update" inverse="true"> <!--外键--> <!--hibernate 内部会通过外键生产SQL语句--> <key> <column name="cid"></column> </key> <!--建立了对象与对象之间的关联--> <one-to-many class="com.sanmao.utils.Student"></one-to-many> </set> </class> </hibernate-mapping>
/** * 级联操作 * 在保存班级的同时级联保存学生 * */ @Test public void testSaveClasses_Cascade_Save_Student(){ Session session=sessionFactory.getCurrentSession(); Transaction transaction=session.beginTransaction(); Classes classes=new Classes(); classes.setName("JAVA"); classes.setDescription("厉害"); //建立班级与学生之间的关系 Set<Student> students=new HashSet<>(); Student student1=new Student(); student1.setName("三毛1"); student1.setDescription("你好"); Student student2=new Student(); student2.setName("三毛2"); student2.setDescription("你好"); students.add(student1); students.add(student2); classes.setStduents(students); session.save(classes); transaction.commit(); }
显示操作
在代码中调用session.save/update方法进行操作的时候,这种情况为显示操作。
隐式操作
在代码中并没有session.save(student)这样的代码,但是最后却形成了保存student
的sql语句,所以这个操作是在hibernate内部执行的,并不是由程序来执行的。
在保存班级的时候级联更新学生
说明:
当事务提交的时候,执行了session.flush:
1、检查session一级缓存中所有的持久化对象
如果该对象在数据库中没有相应的记录,则发出insert语句
如果该对象在数据库有相应的记录(有id值),则和副本进行对比
如果一样,则什么都不做,如果不一样,则发出update语句
2、如果在Classes.hbm.xml文件中的set元素中有cascade选项,并且值为
“save-update”,这个时候,hibernate内部再次会去检查classes的关联对象
Set:students,在set集合中一个一个查找,如果该对象是临时状态
的对象,则发出insert语句,如果是持久化状态的对象,则会对照副本
来判断是否发出update语句
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- jquery 表单验证之通过 class验证表单不为空
- vue.js入门教程之绑定class和style样式
- setAttribute 与 class冲突解决
- Vue.js每天必学之Class与样式绑定
- JavaScript通过HTML的class来获取HTML元素的方法总结
- JavaScript中的类(Class)详细介绍
- 原生js实现class的添加和删除简单代码
- javascript面向对象包装类Class封装类库剖析
- jQuery针对input的class属性写了多个值情况下的选择方法
- 详解js中class的多种函数封装方法
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- jQuery点击改变class并toggle及toggleClass()方法定义用法
- jquery采用oop模式class类的使用示例
- jquery点击改变class并toggle的实现代码