有两个类,一个Student类和一个Grade类。
public class Student {
private int stuId;
private String stuName;
private int age;
//多对一
private Grade grade;
.......省略
}
public class Grade {
private int gradeId;
private String gradeName;
//一对多
private Set<Student> students = new HashSet<Student>();
......省略
}
Student.hbm.xml文件
<class name="Student">
<id name="stuId">
<generator class="native"></generator>
</id>
<property name="stuName"></property>
<property name="age"></property>
<!-- 多对一 -->
<many-to-one name="grade" class="Grade"
column="grade_Id"/>
</class>
Grade.hbm.xml文件
<class name="Grade">
<id name="gradeId">
<generator class="native"></generator>
</id>
<property name="gradeName"></property>
<!-- students属性表示与Student的一对多关系 -->
<set name="students" cascade="all">
<key column="grade_Id"></key>
<one-to-many class="Student"/>
</set>
</class>
此时我们由一的一端进行关系的维护,即Grade。
Student stu1 = new Student();
stu1.setStuName("jack");
stu1.setAge(20);
Student stu2 = new Student();
stu2.setStuName("rose");
stu2.setAge(25);
Grade g = new Grade();
g.setGradeName("1105");
g.getStudents().add(stu1);
g.getStudents().add(stu2);
session.save(g);
观察下sql语句:
Hibernate: insert into Grade (gradeName) values (?)
Hibernate: insert into Student (stuName, age, grade_Id) values (?, ?, ?)
Hibernate: insert into Student (stuName, age, grade_Id) values (?, ?, ?)
Hibernate: update Student set grade_Id=? where stuId=?
Hibernate: update Student set grade_Id=? where stuId=?
观察sql语句发现,每条insert语句都会对应一条update语句,由此我们可以知道插入的grade_Id可能为空,然后通过update语句进行的更新。
所以我们设置not-null = “true”,势必会报错,果不其然。
下面我们将由多的一段进行维护
Grade.hbm.xml
<class name="Grade">
<id name="gradeId">
<generator class="native"></generator>
</id>
<property name="gradeName"></property>
<!-- students属性表示与Student的一对多关系 -->
<set name="students" inverse="true">
<key column="grade_Id" not-null="true" />
<one-to-many class="Student"/>
</set>
</class>
Student.hbm.xml
<class name="Student">
<id name="stuId">
<generator class="native"></generator>
</id>
<property name="stuName"></property>
<property name="age"></property>
<!-- 多对一 -->
<many-to-one name="grade" class="Grade"
column="grade_Id" not-null="true" cascade="all"/>
</class>
此时我已将外键置为不能为空。
观察sql语句
Hibernate: insert into Grade (gradeName) values (?)
Hibernate: insert into Student (stuName, age, grade_Id) values (?, ?, ?)
Hibernate: insert into Student (stuName, age, grade_Id) values (?, ?, ?)
因此在配置多对一的关联映射的时候,最好将关联控制交由多的一方进行维护。