【Hibernate】——一对多映射

来源:互联网 发布:淘宝上的体检中心在哪 编辑:程序博客网 时间:2024/05/17 11:07

          正如上篇【Hibernate】——多对一映射 所说,一对多映射是多对一的反例,一个班有多个学生,这就是一种

一对多的体现。如图所示:


          建立Class实体类,在Class建立Student的集合关系:

package com.bjpowernode.hibernate;import java.util.Set;/** * 建立Class实体类 * @author why_768 * */public class Class {private int id;private String name;private Set students;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set getStudents() {return students;}public void setStudents(Set students) {this.students = students;}}

            class实体映射文件配置,在set标签里设置class与student的一对多关系,并且在t_student里添加外键classid:

<?xml version="1.0"?><!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.bjpowernode.hibernate.Class" table="t_class"><id name="id"><!-- 采用foreign生成策略,会取得关联对象的标识 --><generator class="native" /></id><property name="name"/><set name="students"><key column="classid"/><one-to-many class="com.bjpowernode.hibernate.Student"/></set></class></hibernate-mapping>

            新建student实体对象:
package com.bjpowernode.hibernate;public class Student {    private int id;        private String name;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }  }

            配置Student的实体映射文件:          

<?xml version="1.0"?><!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.bjpowernode.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>

               配置完成了,新建数据库,生成数据库表。建立一个Junit测试类,保存一条数据:

    public void testSave1(){        Session session = null;        try {            session = HibernateUtils.getSession();            session.beginTransaction();                        Student student1 = new Student();            student1.setName("Yana");            session.save(student1);                        Student student2 = new Student();            student2.setName("ZJ");            session.save(student2);                        Class class1 = new Class();            class1.setName("一班");                        Set students = new HashSet();            students.add(student1);            students.add(student2);                        class1.setStudents(students);                        session.save(class1);                        session.getTransaction().commit();        } catch (Exception e) {            e.printStackTrace();            session.getTransaction().rollback();        } finally{            HibernateUtils.closeSession(session);        }    }

            数据已经保存到数据库了:   

                                        

           这就是一对多映射的单向映射,有单向映射,当然也有双向映射咯。双向映射也很简单,只需要在Student实

体类里添加属性Class:

package com.bjpowernode.hibernate;public class Student {private int id;private String name;private Class class1;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Class getClass1() {return class1;}public void setClass1(Class class1) {this.class1 = class1;}}

          然后在Student的映射文件里配置多对一:

<?xml version="1.0"?><!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.bjpowernode.hibernate.Student" table="t_student">        <id name="id">            <generator class="native"/>        </id>        <property name="name"/>            <many-to-one name="class1" column="classid"/>        </class></hibernate-mapping>

           基本设置就完成了,这样无论通过Student还是Class都能保存和查询数据了。至于数据库中字段classid的维

护,如果需要让Student进行维护,只需要在Class.hbm.xml映射文件里配置inverse属性:

<!-- inverse=“true”影响存储管理,只能由一的一方进行管理 --><set name="students" inverse="true"><key column="classid"/><one-to-many class="com.bjpowernode.hibernate.Student"/></set>
           inverse用在一个对多和多对多双向关联上,主要影响存储管理,如果inverse=“true”,本端不能维护,会交给

另一端维护。

           一对多映射讲到这里,下篇主要讲一对一映射关系。

0 0
原创粉丝点击