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

Posted 西瓜的小弟西西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
}

 




以上是关于hibernate 关联关系(多对多对多一对一)的配置的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate映射关系:一对一对多和多对多

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

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

Hibernate关联关系配置(一对多一对一和多对多)

(转)Hibernate框架基础——多对多关联关系映射

利用hibernate实现数据库对象关联(多对一对多一对多对多)