Hibernate双向多对一映射

来源:互联网 发布:mac app store创建id 编辑:程序博客网 时间:2024/06/03 22:53

有两个类,一个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 (?, ?, ?)

因此在配置多对一的关联映射的时候,最好将关联控制交由多的一方进行维护。

阅读全文
1 0