数据库表关系及配置

1.数据库表中的关系

  一对一

  一对多(多对一)

  多对多

2.如何确立和实现数据库中的表关系

  一对多的表关系实现:

    使用外键约束

    我们习惯把一的方称为主表,把多的方称为从表  

    外键:从表中有一列,除了null之外,只能来源于主表的主键

       默认情况下,外键的字段是可以重复的

  多对多的表关系在数据库中实现:

    使用中间表

    中间表有两个外键,引用两个多对多表的主键

    不能有其它字段信息,至于中间表的主键,应该采用联合主键

    任何一个多方表和中间表去比较都是一对多的关系

  一对一的表关系再数据库中实现:

    有两种:

      1.以建立外键的方式

        使用外键约束,唯一约束,非空约束

        他是把外键字段加上了非空和唯一约束,从而实现一对一

      2.使用主键的方式

        让其中一张表即是主键,又是外键。

3.多表映射配置要遵循的步骤

  第一步:确定两张表之间的关系

  第二步:在数据库中实现两张表之间的关系建立

  第三步:在实体类中描述出两个实体之间的关系

  第四步:在映射配置文件中简历两个实体和两个表之间的关系

4.一对多关系映射配置及操作

  示例:人员表和角色表

  第一步:确定两个表之间的关系

      一个角色可以对应多个人员

      role角色表是主表,person人员表是从表

  第二步:在数据库表中简历联系

      实现一对多关系,靠外键

      person表中的r_id外键,是person的主键。

代码示例:

1.数据库表

2.hibernate.md.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!--SessionFactory用来创建Session对象,Session对象时操作数据库的核心-->
    <!--SessionFactory必要部分:1.连接数据库信息;2.hibernate的可选配置;3.映射文件配置-->
    <session-factory>
        <!-- 1.连接数据库的基本信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/mybatis</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>

        <!-- 2.hibernate的可选配置 -->
        <!-- hibernate里的配置,数据库使用的方言,开发过程中要在控制台显示,sql -->
        <!--<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>-->
        <property name="hibernate.show_sql">true</property>
       <!-- <property name="hibernate.format_sql">true</property>-->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--绑定线程和session,实现一个session只有一个线程。-->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- c3p0的配置 -->
        <!-- hibernate.connection.provider_class使用c3p0数据库连接池的一个配置 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

        <!--3.映射文件配置-->
        <!-- ORM映射关系 ,导入相应模型的绝对路径-->
        <mapping resource="person.hbm.xml"/>
        <mapping resource="role.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

3.person.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
        <!--导入dbd约束-->
        <!DOCTYPE hibernate-mapping PUBLIC
                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bean">
    <class name="Person" table="person">
        <id name="pId" column="p_id">
            <generator class="native"></generator>
        </id>
        <property name="pName" column="p_name"></property>
        <property name="pAddress" column="p_address"></property>
        <!--一对多关系映射:从表实体的映射配置
            涉及的标签: many-to-one
            作用:建立多对一的映射配置
            属性:name 从实体中映入主表实体对象的引用名称
                 class 指定属性对应的实体类名称
                 column 指定从表中外键字段的名称
        -->
        <many-to-one name="role" class="Role" column="p_r_id"></many-to-one>
    </class>
</hibernate-mapping>

4.role.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--导入dbd约束-->
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bean">
    <class name="Role" table="role">
        <id name="rId" column="r_id">
            <generator class="native"></generator>
        </id>
        <property name="rName" column="r_name"></property>
        <!--一对多关系映射:主表实体的映射配置
            涉及的标签: set/list  key  many-to-one
            作用:用于配置set/list集合属性
            属性:name 指定实体中set/list集合属性名称
                 table 指定从表名称。一对多配置可以补血
            key作用:用于映射外键字段
               属性:column 指定外键名称
            many-to-one作用:建立一对多的映射配置
                       属性:calss 指定从表实体的名称
                            cascade="save-update" 级联更新为true
            级联删除需要配置inverse="true" cascade="save-update,delete"(开发中一般慎用)
        -->
        <set name="set"   table="person" inverse="true" cascade="save-update,delete">
            <key column="p_r_id" ></key>
            <one-to-many class="Person"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

5.实体类

public class Person implements Serializable {
    private Integer pId;
    private String pName;
    private String pAddress;
    //一对多关系映射,从表实体包含主表实体的对象引用
    private Role role;
}  //省了get/set方法
public class Role implements Serializable {
    private Integer rId;
    private String rName;
    //一对多关系映射,主表实体应该包含从表实体的集引用
    private Set<Person> set;
} //省去get/set方法

6.测试类

public class TestHibernate01 {

    //查询Person
    @Test
    public void test01() {
        Session s = HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Query query = s.createQuery("from Person ");
        List list = query.list();
        for (Object o : list) {
            Person person = (Person) o;
            System.out.println(person.getpName() + ":" + person.getRole().getrName());
        }
        tx.commit();
    }

    //查询所有的Role
    @Test
    public void test02() {
        Session s = HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Query query = s.createQuery("from Role");
        List list = query.list();
        for (Object o : list) {
            Role role = (Role) o;
            System.out.println(role.getrName());
            for (Person person : role.getSet()) {
                System.out.println("set:" + person.getpName());
            }
        }
        tx.commit();
    }

    //修改角色的操作保存操作
    @Test
    public void test03() {
        Session s = HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Role o = (Role) s.get(Role.class, 1);
        System.out.println("Role=" + o);
        Person o1 = (Person) s.get(Person.class, 2);
        o1.setRole(o);
        System.out.println("Person=" + o1);
        s.update(o1);
        tx.commit();
    }

    //级联更新
    // set标签的属性cascade="save-update" 级联更新为true
    @Test
    public void test04() {
        Session s = HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Role o = (Role) s.get(Role.class, 3);
        o.setrName("大将");
        System.out.println("Role=" + o.getrName());
        s.save(o);
        tx.commit();
    }

    //级联删除
    // set标签 级联删除需要配置inverse="true" cascade="save-update,delete"(开发中一般慎用)
    @Test
    public void test05() {
        Session s = HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Role o = (Role) s.get(Role.class, 3);
        s.delete(o);
        tx.commit();
    }
}

5.多对多关系映射配置及操作

  

  

原文地址:https://www.cnblogs.com/jasonjson/p/12433356.html

时间: 2024-08-27 18:17:03

数据库表关系及配置的相关文章

数据库表关系(一堆垛,多对多)

1.记住,永远记住:表与表之间关联的唯一手段就是外键 表与表之间相关联只能通过外键. 2.所以数据库表与表之间的,一对多,多对多关系.说白了就是怎样建立外键的关系,在哪个表建立外键. 通过外键维持各种表之间的关系. 3. 6 表与表之间的关系 l 一对一:例如t_person表和t_card表,即人和身份证.这种情况需要找出主从关系,即谁是主表,谁是从表.人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表.设计从表可以有两种方案: 在t_card表中添加外键列(相对t_use

六 Hibernate表关系及其配置

Hibernate的一对多关联映射 Hibernate的多对多关联映射 数据库表与表之间的关系:一对多,多对多,一对一 一对多:一个部门对应多个员工,一个员工只能属于一个部门.一个客户对应多个联系人,一个联系人只能属于一个客户 一对多建表:在多的一方创建外键. 多对多:一个学生可以选择多门课程,一门课程可以被多个学生选择.一个用户可以选择多个角色,一个角色可以被多个用户选择. 多对多建表:创建中间表.中间表至少有两个字段分别作为外键指向多对多双方的主键. 一对一(了解): 一般可以建成一张表.

数据库 表关系设计参考

表关系设计 出版社表关系 # 出版社表 class Publisher(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=128) phone = models.IntegerField() def __str__(self): return self.name # 作者表 class Author(models.Model): name = models.CharFi

数据库表关系:多对多的三中方式

1.第一种django orm在创建表的时候自动帮我们创建表关系 from django.db import models # Create your models here. #创建book表 class Book(models.Model): name=models.CharField(max_length=32) # 第一种方式,系统帮我们自动创建了表book与表author关系 authors=models.ManyToManyField(to='Author') #创建作者表 clas

5.6 数据库表关系

多对一或者一对多 格式: constraint 起个名字 foreign key(关联字段) references 被关联表(被关联字段) on delete cascade # 是否联动删除 on update cascade # 是否联动更新 示例: 一个出版社可以出多本书    一对多 一本书可以被多个出版社出版 一对多 代码: 被关联表 create table press( id int primary key auto_increment, name char(20) ); 关联表

Sonar 数据库表关系整理一(续)

简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习和理解. 如题,目前网络上搜不到相关内容,只能自己慢慢整理,作为资料,以备查询. ========================================================================================= 查询某个月被扫描到的最多的规则: SELECT i.rule_id,r.name AS rulename,COUNT(*)

EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点击浏览搜索EF安装,我这里主要是EF6.0 以上的学习 所以都安装6.0 以上的版本 接下来在Model文件夹下面创建一个Customer类 public class Customer { public int ID { get; set; } public string Name { get; set; }

Hibernate多表关系配置——多对多对关系映射

多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关.第二个表中的一个行也可以与第一个表中的一个或多个行相关. 一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的 1.实体 1.1 课程实体 package demo.entity; import java.util.HashSet; import java.util.Set; /** * 课程实体 * @auth

Hibernate多表关系配置——一对一关系映射

两个对象之间是一对一的关系,如Person-IdCard 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 唯一外键关联 外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系: 1.实体对象 1.1 Person实体对象 package demo.entity; /** * 人实体 * @author Don * @date:日期:2