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

核心思想:

数据库表对应java类(表-类),表的字段对应类的属性(字段-属性)

关联:把数据库中的外键映射,变成对象的关联关系。

多对一,一对多,一对一,多对多

单向,双向

一、单向,多对一(Info,Nation多个人有同一个民族)
准备两个基本类和映射文件
1.给类加关联对象

import java.util.Date;

public class Info {
    private String code;
    private String name;
    private Boolean sex;
    private Date birthday;
    private Nation nationObj;//给类加关联对象。添加一个成员nationObj,并生成getter和setter

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Boolean getSex() {
        return sex;
    }
    public void setSex(Boolean sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public Nation getNationObj() {
        return nationObj;
    }
    public void setNationObj(Nation nationObj) {
        this.nationObj = nationObj;
    }
}
public class Nation {
    private String code;
    private String name;
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2.给hbm.xml文件加关联映射

给Info.hbm.xml加上<many-to-one>
<many-to-one name="nationObj" column="nation"></many-to-one>

<?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 package="maya.model">
    <class name="Info" table="Info">
        <id name="code" type="java.lang.String">
            <column name="code" />
            <generator class="assigned"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
        <property name="sex" type="java.lang.Boolean">
            <column name="sex" />
        </property>
        <property name="birthday" type="java.util.Date">
            <column name="birthday" />
        </property>

        <!--加上<many-to-one> -->
        <!--column:列,class:类名, cascade="save-update",加这个配置属性目的是,many表和one表一起更新 -->
        <many-to-one name="nationObj" column="nation" class="Nation" cascade="save-update">
        </many-to-one>
    </class>
</hibernate-mapping>    

注意:

1.主要针对的是哪个对象? --- Info
2.主表是谁?从表是谁?主表是约束别人的,从表是被约束的。 外键在从表上。
主表是nation,从表是info
3.在实体类中,外键属性与关联对象,留一个就可以。在hbm.xml文件中,外键属性与<many-to-one>也留一个就可以。
如果两个都保留,记得在<many-to-one>上加上两个属性insert=false,update=false。
4.一般需要加上cascade="save-update",加这个配置业属性目的是,many表和one表一起更新

二、单向,一对一(Login和Info)
准备两个一对一的表和类
1.给类加关联对象
给Login加上infoObj属性

public class Login {
    private int ids;
    private String userName;
    private String password;
    private Info infoObj;
    public int getIds() {
        return ids;
    }
    public void setIds(int ids) {
        this.ids = ids;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Info getInfoObj() {
        return infoObj;
    }
    public void setInfoObj(Info infoObj) {
        this.infoObj = infoObj;
    }
}

2.给Login.hbm.xml加上<many-to-one>配置

<many-to-one name="infoObj" column="infoCode" unique="true"/>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping>
    <class name="maya.model.Login" table="Login"><!-- 上面的hibernate-mapping不带包的路径,class就得带类的路径,下同 -->
        <id name="ids" type="int">
            <column name="ids" />
            <generator class="native"></generator>
        </id>
        <property name="userName" type="java.lang.String">
            <column name="userName" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" />
        </property>

        <!-- unique的意思是唯一性 -->
        <many-to-one name="infoObj" column="InfoCode" class="maya.model.Info"  unique="true">

        </many-to-one>
    </class>
</hibernate-mapping>

三、单向,一对多(Info,Work)
1.给类加关联对象(集合对象)
private Set<Work> works;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Info {
    private String code;
    private String name;
    private Boolean sex;
    private Date birthday;
    private Nation nationObj;
    private Set<Work> works = new HashSet<Work>(0);//给类加关联对象(集合对象)
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Boolean getSex() {
        return sex;
    }
    public void setSex(Boolean sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public Nation getNationObj() {
        return nationObj;
    }
    public void setNationObj(Nation nationObj) {
        this.nationObj = nationObj;
    }
    public Set<Work> getWorks() {
        return works;
    }
    public void setWorks(Set<Work> works) {
        this.works = works;
    }

}
import java.util.Date;

public class Work {
    private int ids;
    private String infoCode;
    private Date startDate;
    private Date endDate;
    private String firm;
    private String depart;
    private int orders;
    private Info infoObj;//
    public int getIds() {
        return ids;
    }
    public void setIds(int ids) {
        this.ids = ids;
    }
    public String getInfoCode() {
        return infoCode;
    }
    public void setInfoCode(String infoCode) {
        this.infoCode = infoCode;
    }
    public Date getStartDate() {
        return startDate;
    }
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }
    public Date getEndDate() {
        return endDate;
    }
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
    public String getFirm() {
        return firm;
    }
    public void setFirm(String firm) {
        this.firm = firm;
    }
    public String getDepart() {
        return depart;
    }
    public void setDepart(String depart) {
        this.depart = depart;
    }
    public int getOrders() {
        return orders;
    }
    public void setOrders(int orders) {
        this.orders = orders;
    }
    public Info getInfoObj() {
        return infoObj;
    }
    public void setInfoObj(Info infoObj) {
        this.infoObj = infoObj;
    }

}

2.给Info.hbm.xml配置

<set name="实体类中集合成员的变量名(works)">
<one-to-many class="Work">
<key column="infoCode">
</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 package="maya.model">
    <class name="Info" table="Info">
        <id name="code" type="java.lang.String">
            <column name="code" />
            <generator class="assigned"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
        <property name="sex" type="java.lang.Boolean">
            <column name="sex" />
        </property>
        <property name="birthday" type="java.util.Date">
            <column name="birthday" />
        </property>

         <set name="works" table="Work" cascade="save-update" ><!-- name="实体类中集合成员的变量名(works)"-->
            <key>
                <column name="infoCode" />
            </key>
            <one-to-many class="Work" />
        </set>
    </class>
</hibernate-mapping>

四、多对多(Student和Course,中间表Score)
数据库中没有多对多的关系。只有程序里面有。数据库中是使用两个一对多和多对一来实现多对多的。典型的是:中间表
在程序中,如果中间表中没有其它信息,那就可以不用写中间表的实体类。
多对多,还可以用在:用户和角色的关系上。
1.给类加关联对象(集合对象)

import java.util.Date;
import java.util.Set;

public class Student {
    private String sno;
    private String sname;
    private String ssex;
    private Date sbirthday;
    private String sclass;
    private Set<Course> courses;
    public String getSno() {
        return sno;
    }
    public void setSno(String sno) {
        this.sno = sno;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSsex() {
        return ssex;
    }
    public void setSsex(String ssex) {
        this.ssex = ssex;
    }
    public Date getSbirthday() {
        return sbirthday;
    }
    public void setSbirthday(Date sbirthday) {
        this.sbirthday = sbirthday;
    }
    public String getSclass() {
        return sclass;
    }
    public void setSclass(String sclass) {
        this.sclass = sclass;
    }
    public Set<Course> getCourses() {
        return courses;
    }
    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

}
import java.util.Set;

public class Course {
    private String cno;
    private String cname;
    private String tno;
    private Set<Student> students;
    public String getCno() {
        return cno;
    }
    public void setCno(String cno) {
        this.cno = cno;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public String getTno() {
        return tno;
    }
    public void setTno(String tno) {
        this.tno = tno;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }

}

2.给hbm.xml配置

<set name="当前类的集合属性" table="中间表">
<key column="中间表中与此表对应的外键"></key>
<many-to-many class="另外多方对象的类名" column="另外多方对象在中间表中的外键"></many-to-many>
</set>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping package="maya.model">
    <class name="Course" table="Course">
        <id name="cno" type="java.lang.String">
            <generator class="assigned"></generator>
        </id>
        <property name="cname"/>
        <property name="tno" />

          <set name="students" table="score">
              <key column="cno"></key>
              <many-to-many class="Student" column="sno"></many-to-many>
          </set>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-4 12:27:40 by Hibernate Tools 5.2.1.Final -->
<hibernate-mapping package="com.itnba.maya.model">
    <class name="Student" table="Student">
        <id name="sno" type="java.lang.String">
            <generator class="assigned"></generator>
        </id>
        <property name="sname"/>
        <property name="ssex" />
          <property name="sbirthday" />
          <property name="sclass" column="class" />
          <set name="courses" table="score">
              <key column="sno"></key>
              <many-to-many class="Course" column="cno"></many-to-many>
          </set>
    </class>
</hibernate-mapping>
时间: 2024-10-13 12:42:39

利用hibernate实现数据库对象关联(多对一、一对多、一对一、多对多)的相关文章

hibernate入门三之关联映射(一对多和多对一)

提示:本文的操作是在入门一和二上面的 hibernate对映射类型 在开始是学习的时候,我以为一对多和多对一是同样的,后来发现不是这样,比如说班主任和班级里的学生,一个班级可能有多个学生,但是只有一个班主任,学生和班主任的关系是多对一,班主任和学生的关系是一对多,两者之间的区别在于它们的指向性 一对一(one-to-one ) 一对多(ont-to-many) 多对一(many-to-one) 多对多(many-to-many) 一对多(ont-to-many)和多对一(many-to-one)

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签.博客系统主要有以下几张表构成: Author表:作者信息表,记录作者的信息,用户名和密码,邮箱等. Blog表   :  博客表,一个作者可以开多个博客,即Author和Blog的关系是一对多.

千山万水之Hibernate(六)——关联映射(一对多)

学习Hibernate的过程中,映射是比较重要的一部分,再说其中哪一种映射比较重要(或可以说是比较常用)呢?那一定很多人会想到一对多关联映射.之所以这样说,是因为在生活中很多这样的实例:班级-学生.企业-员工.文件夹-文件.试卷-题目等.至于生活中为什么会遇到这样大量一对多的情况,似乎是哲学方面的事情了,当然大家可以继续思考,而我们今天主要讨论Hibernate中的一对多. 原理分析 我们仍然拿班级.学生之间的关系做例子:一个班级包含多个学生.相应的实体关系图为: 单向关联 由图可知,由于单向的

1、Hibernate注解实现对象关联映射并自动生成数据库表

---恢复内容开始--- 前言:本例单独使用Hibernate框架通过Hibernate注解实现年级表和学生表的一对多关联并完成其级联操作 1.年级表 package pojo; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import j

利用hibernate生成数据库映射

1.新建一个项目. 2.选择Windows->show view->other->myeclipse database建立数据库连接. 3.选择DB Browser就会出现下图右键点击打开. 4.接下来右键选new配置数据库. 5.就会出现. 6.开始配置Hibernate ,选择项目名右键选择MyEcilpse选择add Hibernate 7.next到如下界面选择. 8.选择hibernate放的包. 9.点击finish完成. 10.接下来选择数据库.表. 11.开始生成右键选择

Hibernate系列(五):利用Hibernate完成简单的CRUD操作

这里利用Hibernate操作数据库完成简单的CRUD操作. 首先,我们需要先写一个javabean: package cn.itcast.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id

【SSH三大框架】Hibernate基础第五篇:利用Hibernate完成简单的CRUD操作

这里利用Hibernate操作数据库完成简单的CRUD操作. 首先,我们需要先写一个javabean: package cn.itcast.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id

【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作

这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先.我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id

一对多(多对一)关系中的inverse和cascade属性

首先说一下inverse: "inverse" 直译过来就是"反转,使颠倒"的意思,书面化的解释为"是否将关系维护的权力交给对方" 1. 在hibernate中inverse默认是false,也就是己方拥有维护关系的权利, 当然为true的话,就是把维护关系的权利交给了对方 2. 在一对多的关系(多对一)中,通常将一端的inverse设置为false(一端设为true的话会多出更新语句,有性能问题,下面会讲到),而多对多的关系中,inverse的