第九章 级联,集合映射

级联开关
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);
数据库中的截图
[img]http://dl.iteye.com/upload/attachment/241742/44897128-a4dc-3e91-bb58-8898694457ac.bmp[/img]


 如果我要保证顺序怎么办呢,我们知道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);
}
}
数据库中的截图
[img]http://dl.iteye.com/upload/attachment/241744/8d5334e8-307d-3362-857c-b923d4bab651.bmp[/img]


可以看到现在维护了顺序.

 除了可以使用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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值