hibernate 关联关系(多对一、多对多、一对一)的配置

1:多对一

  一般关系由多的一方来维护

  多的一方需要有一方的字段,一的一方要有多的一方的set集合

  

  一方的配置文件: ClientEntity为一的一方,OrderEntity为多的一方

<?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.yuwenhui.entity.ClientEntity" table="t_client" schema="hibernate">
        <id name="id" column="id"/>
        <property name="name" column="name"/>
        <property name="pawword" column="pawword"/>
        <property name="blance" column="blance"/>
        <!--
            name 一行保存多方集合的字段
            table 数据库中多方的表名称
            inverse 是否反转控制权,一般多对一的关联关系由多方来维护
        -->
        <set name="orders" table="t_order" inverse="true">
            <key>
                <!--
                    name 对应数据中多方表中关联一方的外键
                -->
                <column name="client_id"/>
            </key>
            <!--
                class 多方的实体类路径
            -->
            <one-to-many class="com.yuwenhui.entity.OrderEntity"/>
        </set>
    </class>
</hibernate-mapping>

  多方的配置文件:

<?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.yuwenhui.entity.OrderEntity" table="t_order" schema="hibernate">
        <id name="id" column="id"/>
        <property name="name" column="name"/>
        <property name="price" column="price"/>
        <!--
            name="client" 对应多方的实体类中关联一方的字段
            class 对应一方的类的路径
            column 在数据生成的列的名称
         -->
        <many-to-one name="client" class="com.yuwenhui.entity.ClientEntity" column="client_id" />
    </class>
</hibernate-mapping>

多对多关系

  以学生和课程为列:学生可以有多个课程,课程也可以有多个学生

  学生中需要有一个集合用于保存该学生选修的课程,课程中也需要有一个集合用于保存选修了该课程的学生集合,多对多关系中只需要有一行维护关联关系即可,即在一方添加

inverse="true"属性    学生配置文件  
<?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="domain.Student" table="t_student2" schema="hibernate">
        <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="native" />
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(20)" length="20" not-null="true"/>
        </property>
        <!--
            name 学生表中课程的set集合字段名
            table 需要自动创建的中间表名
            inverse="false"  表示由该类维护关联关系
        -->
        <set name="courses" table="student_course" inverse="false" >
            <key>
                <!-- nam 表示中间表中的字段 -->
                <column name="student_id"/>
            </key>
            <!--
                class 另一方的类
                column 另一方在中间表中的字段
            -->
            <many-to-many class="domain.Course" column="course_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

  

  课程表配置文件

<?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="domain.Course" table="t_course" schema="hibernate">
        <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="native" />
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(20)" length="20" not-null="true"/>
        </property>
        <!--
            name 学生表中课程的set集合字段名
            table 需要自动创建的中间表名
            inverse="false"  表示该类不维护关联关系
        -->
        <set name="students" table="student_course" inverse="true" >
            <key>
                <column name="course_id"/>
            </key>
            <!--
                class 另一方的类
                column 另一方在中间表中的字段
            -->
            <many-to-many class="domain.Student" column="student_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

    多对多测试:

package test;

import domain.Course;
import domain.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Created by Administrator on 2017/9/8 0008.
 */
public class Work98Test {

    SessionFactory sessionFactory;
    Session session;

    @Before
    public  void  before(){
        Configuration configuration = new Configuration();
        configuration.configure();
        sessionFactory = configuration.buildSessionFactory();
        session = sessionFactory.openSession();
    }

    @Test
    public void testSave(){
        Transaction transaction = session.beginTransaction();
        Student student = new Student();
        Course course = new Course();
        course.setName("软件工程");
        student.setName("余文辉");//      学生选修课程
        student.getCourses().add(course);
        session.save(course);
        session.save(student);
        transaction.commit();

    }

    @After
    public  void  after(){
        session.close();
        sessionFactory.close();
    }
}

  3:一对一

    以学生和学生信息表为列,一个学生对应一张学生信息表,一个学生信息表也只能对应一个学生

    需要在对应的表和设置对方的字段,并添加相应的get和set方法

    一对一对应分为两种,一种是两张表之间主键对应,另一种是在一张表中设置外键关联,这里演示的是前一种

    学生类配置文件

  

<?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="domain.Student" table="t_student2" schema="hibernate">
        <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="native" />
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(20)" length="20" not-null="true"/>
        </property>
        <!--
            name 学生表中课程的set集合字段名
            table 需要自动创建的中间表名
            inverse="false"  表示由该类维护关联关系
        -->
        <set name="courses" table="student_course" inverse="false" >
            <key>
                <!-- nam 表示中间表中的字段 -->
                <column name="student_id"/>
            </key>
            <!--
                class 另一方的类
                column 另一方在中间表中的字段
            -->
            <many-to-many class="domain.Course" column="course_id"></many-to-many>
        </set>
            <!--
                    设置一对一关联关系
            -->
        <many-to-one name="informationOfStudent" class="domain.InformationOfStudent" column="information_id" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

  学生信息类配置文件

  

<?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="domain.InformationOfStudent" table="t_information_student" schema="hibernate">
        <id name="id">
            <column name="id" sql-type="int(11)"/>
            <generator class="native"/>
        </id>
        <property name="sex">
            <column name="sex" sql-type="varchar(20)" length="20" not-null="true"/>
        </property>
        <property name="age">
            <column name="age" sql-type="int(11)" not-null="true"/>
        </property>
        <property name="address">
            <column name="address"  sql-type="varchar(20)" length="20"/>
        </property>
        <property name="tel">
            <column name="tel" sql-type="int(11)" not-null="true"/>
        </property>
        <!-- 设置一对一关联关系 -->
        <one-to-one name="student" class="domain.Student"></one-to-one>
     </class>
</hibernate-mapping>

  测试类源码

package test;

import domain.InformationOfStudent;
import domain.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Created by Administrator on 2017/9/8 0008.
 */
public class One2OneTest {
    SessionFactory sessionFactory;
    Session session;

    @Before
    public  void  before(){
        Configuration configuration = new Configuration();
        configuration.configure();
        sessionFactory = configuration.buildSessionFactory();
        session = sessionFactory.openSession();
    }
    @Test
    public void  testAddInformation(){
        Transaction transaction = session.beginTransaction();
        InformationOfStudent  information = new InformationOfStudent();
        information.setAge(20);
        information.setSex("男");
        information.setAddress("江西省");
        information.setTel(10086);
        session.save(information);
        transaction.commit();
    }

    @Test
    public void  testAddRelation(){
        Transaction transaction = session.beginTransaction();
        InformationOfStudent informationOfStudent = (InformationOfStudent) session.get(InformationOfStudent.class,2);
        Student student = (Student) session.get(Student.class,1);
        student.setInformationOfStudent(informationOfStudent);
        session.save(informationOfStudent);
        session.save(student);
        transaction.commit();
    }

    @After
    public  void  after(){
        session.close();
        sessionFactory.close();
    }
}
时间: 2024-10-17 20:57:29

hibernate 关联关系(多对一、多对多、一对一)的配置的相关文章

Hibernate关联关系映射之多对多关联关系

本次仍然使用一个示例的方式进行演示,学生与教师之间的关系就是一个典型的多对多关系,一个教师可以有多个学生,同样一个学生也可以有多个教师.在数据库中存储需要一张学生表存储学生信息,一个教师表存储教师信息,为了表示他们之间的关系我们需要一个中间表来表示他们之间的联系. 例如,在教师表中有id,name两个属性,学生表中同样有id,name两个属性.教师表中有两条记录分别是(1,董老师),(2,李老师):学生表中同样有两条(1,张三),(2,李四).在中间表中有两个字段(teacherId,stude

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

深入浅出Hibernate(二)多对一关系映射

学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比如下图所示的员工和部门之间的关系,那么这种关系在Hibernate中如何映射呢?让我用一个小Demo来详细讲解. 建立映射分为以下几步: 1.设计domain对象Department.Employee,代码如下: package cn.itcast.hibernate.domain; public class Department { private int id; private String name;

hibernate的基础学习--多对多关联

多对多采用学生老师模型进行测试 学生配置文件: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd&quo

--------Hibernate框架之双向多对多关系映射

今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在真实的环境下,一个项目肯定是对应着多个员工的,这毫无疑问, 那么同时,一个比较牛员工也能同时参与多个项目的开发,这就体现了双向多对多的关系. 首先呢,我们得弄清楚在底层数据库中表与表之间的关系,我们创建一个员工表(Employee)和项目表(Project)毫无疑问,那么我们要怎么体现出多对多的关系呢? 当然有很多种方法,这里我以单独提出一张关系表为例,也就是说,我单独创建一张表来

Hibernate一对多、多对一关联

一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group(一方)对象,并添加@ManyToOne注解 1.建Group实体类和User实体类,添加Annotation注解,如下 @Entity @Table(name="_group") //group在MySQL中是关键字,不能直接做表名 public class Group { privat

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course) 学生类的定义以及hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Course> courses = new HashSet<Course>(); 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <

hibernate关系映射(多对一)

对多一关系是最普遍也是最重要的一种对象关系,其中又包括了单向的多对一,单向的一对多以及双向的多对一关系 单向多对一 多的一方:学生(Student) 一的一方:班级(Grade) 班级类的定义以及hbm文件配置如下 1 public class Grade { 2 private int id; 3 private String name; 4 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTY

Hibernate映射关系之多对多

1.用户表user和优惠券coupon存在多对多的关系,一个用户可以拥有多个优惠券,一个优惠券可以从属于多个用户. 2.user.java,创建了中间表tb_user_coupon (1)JoinTable表示中间表的 (2) /** * 一个用户可以拥有多个优惠券 但优惠券只有自己的属性,没有用户的引用 单边的一对多关系 */ @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST }) @JoinTable(n