级联开关
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);
}
}
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);
}
}