- 浏览: 63898 次
- 性别:
- 来自: 武汉
最新评论
-
武大鹏程加内特:
武大鹏程加内特 写道任雅菲 写道
3Q 呵呵
你QQ多少? ...
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
zzy90718 写道
第九章 Spring配置数据连接池 -
武大鹏程加内特:
任雅菲 写道
3Q 呵呵
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
任雅菲 写道
第十一章 MyEclipse自动生成映射文件(上) -
任雅菲:
第十一章 MyEclipse自动生成映射文件(上)
级联开关
1.级联是指两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作;
2.级联配置通过cascade属性实现;
3.cascade属性有四种取值:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
save-update:保存和更新时执行级联操作;
delete:删除时执行级联操作;
4.通过级联操作可以解决持久化对象不能直接引用瞬时对象的问题。
如果支持多种级联,可以这样设置 cascade=” save-update, delete”
cascade并不局限于使用哪个标记上,得活学活用
A:
Myclass类中有一个students集合,
<set name="students" cascade="save-update,delete">
<key column="class_id" />
<one-to-many class="chapter2.model.Student" />
</set>
B:
Student中有一个myclass类
<many-to-one name="myclass" class="chapter2.model.Myclass" cascade="save-update,delete">
<column name="class_id" length="32" />
</many-to-one>
班级绑定学生集合,那么这时保存班级时,自动保存学生
Student student1 = new Student("胶卷", 25, new Date());
Student student2 = new Student("腾迅", 25, new Date());
Student student3 = new Student("网易", 25, new Date());
Student student4 = new Student("淘宝", 25, new Date());
Student student5 = new Student("百度", 25, new Date());
Student student6 = new Student("谷歌", 25, new Date());
Set<Student> students = new HashSet<Student>();
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
students.add(student5);
students.add(student6);
Myclass myclass = new Myclass("java0801");
myclass.setStudents(students);
myclassDao.create(myclass);
删除时也会级联,会自动删除该班级下所有的学生
myclassDao.delete(myclassDao.findById(1));
学生绑定班级,那么这时自动保存班级.
Myclass myclass = new Myclass("java0801");
Student student1 = new Student(myclass, "胶卷", 25, new Date());
Student student2 = new Student(myclass, "活宝", 25, new Date());
studentDao.create(student1);
studentDao.create(student2);
注意双向级联的特性,如果用到了双向级联,特别是delete操作时,会出现意想不到的结果,要多测试几遍才行.
集合映射
set集合映射,配置这时就不再多说了,记住一点,set集合存储数据时,不保证顺序.
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Set<Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.add(new Student(myclass, "张三" + i, 25, new Date()));
}
myclassDao.create(myclass);
数据库中的截图
如果我要保证顺序怎么办呢,我们知道List集合能够保证元素的顺序,那么我们可以用List集合来对应
首先更改Model类:
public class Myclass {
private Integer id;
private String name;
private List<Student> students = new ArrayList<Student>();
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
XML配置:
<list name="students" cascade="save-update,delete">
<key column="class_id" />
<list-index column="listindex" />
<one-to-many class="chapter2.model.Student" />
</list>
这里注意<list-index column="listindex" />
因为List集合需要维护元素的顺序,那么需要新增一个字段来维护顺序.
测试:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
List<Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.add(new Student(myclass, "张三" + i, 25, new Date()));
}
myclassDao.create(myclass);
}
}
数据库中的截图
可以看到现在维护了顺序.
除了可以使用List外,我们还可以使用数组,数组和List一样,也是可以维护元素的顺序.
Model:
public class Myclass {
private Integer id;
private String name;
private Student[] students;
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Student[] getStudents() {
return students;
}
public void setStudents(Student[] students) {
this.students = students;
}
}
XML配置:
<array name="students" cascade="save-update,delete">
<key column="class_id" />
<list-index column="listindex" />
<one-to-many class="chapter2.model.Student" />
</array>
Test:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Student[] students = new Student[10];
for (int i = 0; i < 10; i++) {
//students.add(new Student(myclass, "张三" + i, 25, new Date()));
students[i] = new Student(myclass, "张三" + i, 25, new Date());
}
myclass.setStudents(students);
myclassDao.create(myclass);
}
}
Map映射:
Model:
public class Myclass {
private Integer id;
private String name;
private Map<String, Student> students = new HashMap<String, Student>();
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Student> getStudents() {
return students;
}
public void setStudents(Map<String, Student> students) {
this.students = students;
}
}
XML配置:
<map name="students" cascade="save-update,delete">
<key column="class_id" />
<map-key type="java.lang.String" column="mapkey" />
<one-to-many class="chapter2.model.Student" />
</map>
mapkey在这里和listIndex作用差不多,是Hibernate维护用的字段.
Test:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Map<String, Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.put("key" + i, new Student(myclass, "张三" + i, 22,
new Date()));
}
myclassDao.create(myclass);
}
}
1.级联是指两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作;
2.级联配置通过cascade属性实现;
3.cascade属性有四种取值:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
save-update:保存和更新时执行级联操作;
delete:删除时执行级联操作;
4.通过级联操作可以解决持久化对象不能直接引用瞬时对象的问题。
如果支持多种级联,可以这样设置 cascade=” save-update, delete”
cascade并不局限于使用哪个标记上,得活学活用
A:
Myclass类中有一个students集合,
<set name="students" cascade="save-update,delete">
<key column="class_id" />
<one-to-many class="chapter2.model.Student" />
</set>
B:
Student中有一个myclass类
<many-to-one name="myclass" class="chapter2.model.Myclass" cascade="save-update,delete">
<column name="class_id" length="32" />
</many-to-one>
班级绑定学生集合,那么这时保存班级时,自动保存学生
Student student1 = new Student("胶卷", 25, new Date());
Student student2 = new Student("腾迅", 25, new Date());
Student student3 = new Student("网易", 25, new Date());
Student student4 = new Student("淘宝", 25, new Date());
Student student5 = new Student("百度", 25, new Date());
Student student6 = new Student("谷歌", 25, new Date());
Set<Student> students = new HashSet<Student>();
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
students.add(student5);
students.add(student6);
Myclass myclass = new Myclass("java0801");
myclass.setStudents(students);
myclassDao.create(myclass);
删除时也会级联,会自动删除该班级下所有的学生
myclassDao.delete(myclassDao.findById(1));
学生绑定班级,那么这时自动保存班级.
Myclass myclass = new Myclass("java0801");
Student student1 = new Student(myclass, "胶卷", 25, new Date());
Student student2 = new Student(myclass, "活宝", 25, new Date());
studentDao.create(student1);
studentDao.create(student2);
注意双向级联的特性,如果用到了双向级联,特别是delete操作时,会出现意想不到的结果,要多测试几遍才行.
集合映射
set集合映射,配置这时就不再多说了,记住一点,set集合存储数据时,不保证顺序.
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Set<Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.add(new Student(myclass, "张三" + i, 25, new Date()));
}
myclassDao.create(myclass);
数据库中的截图
如果我要保证顺序怎么办呢,我们知道List集合能够保证元素的顺序,那么我们可以用List集合来对应
首先更改Model类:
public class Myclass {
private Integer id;
private String name;
private List<Student> students = new ArrayList<Student>();
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
XML配置:
<list name="students" cascade="save-update,delete">
<key column="class_id" />
<list-index column="listindex" />
<one-to-many class="chapter2.model.Student" />
</list>
这里注意<list-index column="listindex" />
因为List集合需要维护元素的顺序,那么需要新增一个字段来维护顺序.
测试:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
List<Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.add(new Student(myclass, "张三" + i, 25, new Date()));
}
myclassDao.create(myclass);
}
}
数据库中的截图
可以看到现在维护了顺序.
除了可以使用List外,我们还可以使用数组,数组和List一样,也是可以维护元素的顺序.
Model:
public class Myclass {
private Integer id;
private String name;
private Student[] students;
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Student[] getStudents() {
return students;
}
public void setStudents(Student[] students) {
this.students = students;
}
}
XML配置:
<array name="students" cascade="save-update,delete">
<key column="class_id" />
<list-index column="listindex" />
<one-to-many class="chapter2.model.Student" />
</array>
Test:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Student[] students = new Student[10];
for (int i = 0; i < 10; i++) {
//students.add(new Student(myclass, "张三" + i, 25, new Date()));
students[i] = new Student(myclass, "张三" + i, 25, new Date());
}
myclass.setStudents(students);
myclassDao.create(myclass);
}
}
Map映射:
Model:
public class Myclass {
private Integer id;
private String name;
private Map<String, Student> students = new HashMap<String, Student>();
public Myclass() {
}
public Myclass(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Student> getStudents() {
return students;
}
public void setStudents(Map<String, Student> students) {
this.students = students;
}
}
XML配置:
<map name="students" cascade="save-update,delete">
<key column="class_id" />
<map-key type="java.lang.String" column="mapkey" />
<one-to-many class="chapter2.model.Student" />
</map>
mapkey在这里和listIndex作用差不多,是Hibernate维护用的字段.
Test:
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
MyclassDao myclassDao = new MyclassDao();
Myclass myclass = new Myclass("java0801");
Map<String, Student> students = myclass.getStudents();
for (int i = 0; i < 10; i++) {
students.put("key" + i, new Student(myclass, "张三" + i, 22,
new Date()));
}
myclassDao.create(myclass);
}
}
发表评论
-
第十七章 离线,命名查询
2010-05-03 20:29 825 离线查询 在Hibernate中,查询有两种方式,一种是 ... -
第十六章 批量插入,多类分页查询
2010-05-03 20:26 955批量插入 有时候我们需要做导入的功能,那么这个时候就需要批量插 ... -
第十五章 事务边界问题
2010-05-03 20:24 2590 事务边界问题 我们先回顾一下我们现在写的代码: 可 ... -
第十四章 缓存的使用
2010-05-03 20:18 826缓存的使用 我们先来模拟一个缓存的机制 以查询学生为示例: p ... -
第十三章 lazy懒加载
2010-05-03 20:12 944lazy属性:懒加载 作用:当调用方法的时候才去执行要执行的S ... -
第十二章 继承关系的映射
2010-05-03 20:07 855继承模型 在企业中经常会有员工的分类 我们在Java对象模型 ... -
第十一章 MyEclipse自动生成映射文件(下)
2010-04-28 19:57 1250选中必要的选项 选择主键生成的策略: 设置类名与数据库 ... -
第十一章 MyEclipse自动生成映射文件(上)
2010-04-28 19:44 3191 设置数据库连接 转换视图 创建新的数据库连接 设置 ... -
第十章 Inverse的作用
2010-04-28 19:04 740Inverse的作用 我们还是拿上一章的班级与学生的示例来说 ... -
第八章 Hibernate分页
2010-04-28 18:55 655Hibernate分页 -
第七章 多对多
2010-04-28 18:50 637 多对多 什么情况下会出现多对多呢?比如学生选课就会出现多 ... -
第六章 一对一关系
2010-04-28 18:49 743什么时候采用一对一关系映射呢? 比如我们有时在网上注册的时候, ... -
第五章 一对多关系
2010-04-28 18:44 797 一对多的关系 在学生与班级对象模型中,通常多个学生实体对应 ... -
第四章 多对一关系
2010-04-28 18:43 838今天我们讲多表操作, 多对一的关系 何为多对一呢? 示例: 学 ... -
第三章 对象的状态
2010-04-28 18:42 852 current_session_context_class ... -
第二章 Hibernate增删改查参考
2010-04-28 18:39 1659Hibernate中对增删改查的小结 mysql中库表N ... -
第二章 策略及对象增删改查操作
2010-04-28 18:37 1066Generator 主键生成器 incre ... -
第二章 对象关系数据库映射基础
2010-04-28 18:35 898Generator 主键生成器 incre ... -
第一章 Hibernate环境搭建
2010-04-28 18:34 1413如果是WEB工程,我们只需 ...
相关推荐
第9章 使用AttributesNHibernate.Mapping.Attributes 20 如何使用? 20 提示 21 已知的问题和TODOs 22 开发者须知 22 第10章 NHibernate.Tool.hbm2net 23 什么是 NHibernate.Tool.hbm2net? 23 第11章 Nullables 23 ...
第9章 通过Hibernate操纵对象(下) 9.1 与触发器协同工作 9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过...
第9章 通过Hibernate操纵对象(下) 9.1 与触发器协同工作 9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过...
第9章 通过Hibernate操纵对象(下) 9.1 与触发器协同工作 9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过...
第9章 通过Hibernate操纵对象(下) 9.1 与触发器协同工作 9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过...
第9章 使用对象 9.1 持久化生命周期 9.1.1 对象状态 9.1.2 持久化上下文 9.2 对象同一性和等同性 9.2.1 引入对话 9.2.2 对象同一性的范围 9.2.3 脱管对象的同一性 9.2.4 扩展持久...
第九章开始讨论开发的流程以及一些有用的工具,通过一个NHibernate应用解释几种着手点。我们同时也研究一些领域模型及数据库关联的代码生成和自动维护模式。紧接着我们还研究了如何通过NHibernate解决传统的数据库...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...
高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联(Ternary associations) 7.3.4. 使用 7.4. 集合...
7.3. 高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联(Ternary associations) 7.3.4. 使用 7.4. 集合...
7.3. 高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联(Ternary associations) 7.3.4. 使用 7.4. 集合...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联(Ternary associations) 6.3.4. 使用 6.4. 集合例子...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...
高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联(Ternary associations) 6.3.4. 使用 6.4. 集合例子...
6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...