`

第九章 级联,集合映射

阅读更多
级联开关
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);
}
}

  • 大小: 12.5 KB
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    NHibernate中文文档

    第9章 使用AttributesNHibernate.Mapping.Attributes 20 如何使用? 20 提示 21 已知的问题和TODOs 22 开发者须知 22 第10章 NHibernate.Tool.hbm2net 23 什么是 NHibernate.Tool.hbm2net? 23 第11章 Nullables 23 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第9章 通过Hibernate操纵对象(下)  9.1 与触发器协同工作  9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第9章 通过Hibernate操纵对象(下)  9.1 与触发器协同工作  9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第9章 通过Hibernate操纵对象(下)  9.1 与触发器协同工作  9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第9章 通过Hibernate操纵对象(下)  9.1 与触发器协同工作  9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过...

    Hibernate实战(第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 in Action by Christian Bauer

    第九章开始讨论开发的流程以及一些有用的工具,通过一个NHibernate应用解释几种着手点。我们同时也研究一些领域模型及数据库关联的代码生成和自动维护模式。紧接着我们还研究了如何通过NHibernate解决传统的数据库...

    Hibernate参考文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    hibernate 框架详解

    高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联(Ternary associations) 7.3.4. 使用 7.4. 集合...

    Hibernate教程

    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. 集合...

    hibernate3.04中文文档.chm

    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. 集合...

    Hibernate中文详细学习文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    最全Hibernate 参考文档

    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. 集合例子...

    Hibernate 中文 html 帮助文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    hibernate 体系结构与配置 参考文档(html)

    高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    Hibernate3+中文参考文档

    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. 集合例子...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

Global site tag (gtag.js) - Google Analytics