1.建立两个类
public class Classes implements Serializable{
private Long cid;
private String name;
private String description;
private Set<Student> students;
setter getter 方法省略
}
从Classes端能联系到Student,但是从Student端联系不到Classes,这种情况称为一对多的单项
-----------------------------------------------------------------------------
public class Student implements Serializable{
private Long sid;
private String name;
private String description;
setter getter 方法省略
}
2.映射文件的配置
Clasess.hbm.xml的配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hw.entity.Classes">
<id name="cid" length="5">
<generator class="increment"></generator>
</id>
<property name="name" length="20"></property>
<property name="description" length="50"></property>
<set name="students" cascade="save-update" inverse="false">
<key>
<column name="cid"></column>
</key>
<one-to-many class="com.hw.entity.Student"/>
</set>
</class>
</hibernate-mapping>

Clasess.hbm.xml的配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.itheima11.hibernate.onetomany.single.Student">
<id name="sid" length="5">
<generator class="increment"></generator>
</id>
<property name="name" length="20"></property>
<property name="description" length="50"></property>
</class>
</hibernate-mapping>
级联
前提条件有两个:

2、在代码中,必须建立关联

3、必须显示操作classes
session.save(classes);
cascade与inverse的区别:
cascade指的是对象与对象之间的关系
all
delete
save-update
inverse针对的是外键
inverse 是否维护关系
true 不维护关系
false 维护关系
default:false
说明
在执行session.flush的时候,
1、会检查hibernate一级缓存中所有的持久化状态的对象,来决定发出
insert语句或者update语句
2、会检查这些持久化对象中有没有关联对象,如果有,则再次去检查这些 持久化状态的对象中有
没有设置级联.
如果有则检查关联对象是否是持久化状态的对象
如果是,则再次检查副本
如果不一样,则隐式发出update语句
关联对象不是持久化状态的对象
则发出insert语句
3、检查持久化对象是否有维护关系的权利,就是检查持久化对象对应的映射文件
中的inverse属性是否为false/default,如果是该值,则会自动维护关系(会发出
维护关系的update语句)
列如:
保存班级级联保存学生
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setName("陆梅坡");
classes.setDescription("梅须逊雪三分白");
Student student = new Student();
student.setName("白朴");
student.setDescription("淡烟衰草孤村");
Set<Student> students = new HashSet<Student>();
students.add(student);
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
保存班级级联更新学生
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setName("陆梅坡");
classes.setDescription("梅须逊雪三分白");
Student student = session.get(Student.class, 1L);
student.setName("哈哈");
Set<Student> students = new HashSet<Student>();
students.add(student);
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
更新班级级联更新学生
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classes classes = new Classes();
classes.setName("陆梅坡");
classes.setDescription("梅须逊雪三分白");
Classes clasess = session.get(Classes.class, 1l);
Set<Student> students = classes.getStudents();
classes.setDescription("s");
for(Student student:students){
student.setDescription("x");
}
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
网友评论