Hibernate 关系配置

表之间关系

1. 一对多

  • 一个部门有多个员工,一个员工只能属于某一个部门
  • 一个班级有多个学生,一个学生只能属于一个班级

2. 多对多

  • 一个老师教多个学生,一个学生可以被多个老师教
  • 一个学生可以先择多门课程,一门课程可以被多个学生选择

3. 一对一

  • 一个公司只能对应一个注册地址

表之间关系建表原则

1. 一对多

在多的一方创建一个外键,指向一的一方的主键

2. 多对多

创建一个中间表,中间表至少有两个字段,分别作为外键指向多对多双方的主键

3. 一对一

唯一外键对应

主键对应

一对多关系配置

一、 建立表

1. 客户

  • 一个客户可以有多个联系人
CREATE TABLE `customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. 销售联系人

  • 一个联系人只能属于某一个客户
CREATE TABLE `linkman` (
  `link_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
  `link_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
  `link_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
  `link_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
  `link_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
  `link_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
  `link_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
  `link_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
  `link_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
  `link_cust_id` bigint(32) NOT NULL COMMENT '客户id',
  PRIMARY KEY (`link_id`),
  KEY `FK_cst_lkm` (`link_cust_id`),
  CONSTRAINT `FK_cst_lkm` FOREIGN KEY (`link_cust_id`) REFERENCES `customer` (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

关系图

二、建立ORM

1.实体类与数据库中字段进行建立

客户实体类
@[email protected]
public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_phone;
    private String cust_mobile;
}
销售实体类
@[email protected]
public class Linkman {
    private Long link_id;
    private String link_name;
    private String link_gender;
    private String link_phone;
    private String link_mobile;
    private String link_email;
    private String link_qq;
    private String link_position;
    private String link_memo;
    private String link_cust_id;
}

2.设置两表之间的关系

  • 一个客户可以有多个联系人
@[email protected]
public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_phone;
    private String cust_mobile;

    // 一个客户可以有多个联系人
    private Set<Linkman> linkmens = new HashSet<>();

    @Override
    public String toString() {
        return "Customer{" + "cust_id=" + cust_id + ", cust_name='" + cust_name + '\'' + ", cust_source='" + cust_source
                + '\'' + ", cust_industry='" + cust_industry + '\'' + ", cust_level='" + cust_level + '\''
                + ", cust_phone='" + cust_phone + '\'' + ", cust_mobile='" + cust_mobile + '\'' + '}';
    }
}
  • 一个联系人只能属于某一个客户
@[email protected]
public class Linkman {
    private Long link_id;
    private String link_name;
    private String link_gender;
    private String link_phone;
    private String link_mobile;
    private String link_email;
    private String link_qq;
    private String link_position;
    private String link_memo;
    private String link_cust_id;
    // 一个联系人只对应一个客户
    private Customer customer;

    @Override
    public String toString() {
        return "Linkman{" + "link_id=" + link_id + ", link_name='" + link_name + '\'' + ", link_gender='" + link_gender
                + '\'' + ", link_phone='" + link_phone + '\'' + ", link_mobile='" + link_mobile + '\''
                + ", link_email='" + link_email + '\'' + ", link_qq='" + link_qq + '\'' + ", link_position='"
                + link_position + '\'' + ", link_memo='" + link_memo + '\'' + ", link_cust_id='" + link_cust_id + '\''
                + ", customer=" + customer + '}';
    }
}

三、添加配置文件

1.客户(Customer)实体类的配置文件

<?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.xzh.hibernate.domain.Customer" table="customer">
        <!--建立类属性哪一个是主键 还要跟数据库当中主键进行对象 -->
        <id name="cust_id" column="cust_id">
            <generator class="native" />
        </id>
        <!--建立类中的普通属性与数据库当中字段进行关联 -->
        <property name="cust_name" column="cust_name" />
        <property name="cust_source" column="cust_source" />
        <property name="cust_industry" column="cust_industry" />
        <property name="cust_level" column="cust_level" />
        <property name="cust_phone" column="cust_phone" />
        <property name="cust_mobile" column="cust_mobile" />

        <!--一对多 -->
        <set name="linkmens" cascade="save-update,delete" inverse="true"><!--set属性名称 -->
            <key column="link_cust_id"></key><!--外键 -->
            <one-to-many class="com.xzh.hibernate.domain.Linkman"></one-to-many>
        </set>

    </class>
</hibernate-mapping>

2.联系人(LinkMan)实体类配置文件

<?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.xzh.hibernate.domain.Linkman" table="linkman">
        <!--建立类属性哪一个是主键 还要跟数据库当中主键进行对象 -->
        <id name="link_id" column="link_id">
            <generator class="native" />
        </id>
        <!--建立类中的普通属性与数据库当中字段进行关联 -->
        <property name="link_name" column="link_name" />
        <property name="link_gender" column="link_gender" />
        <property name="link_phone" column="link_phone" />
        <property name="link_mobile" column="link_mobile" />
        <property name="link_email" column="link_email" />
        <property name="link_qq" column=" link_qq" />
        <property name="link_position" column=" link_position" />
        <property name="link_memo" column=" link_memo" />

        <many-to-one name="customer" cascade="save-update"
            class="com.xzh.hibernate.domain.Customer" column="link_cust_id" />
    </class>
</hibernate-mapping>

四、添加核心配置文件

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- 连接数据库的基本参数 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">abcd</property>
        <!-- 配置Hibernate的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 打印SQL -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化SQL -->
        <property name="hibernate.format_sql">true</property>
        <!-- 自动创建表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- C3P0 -->
        <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--在连接池中可用的数据库连接的最少数目 -->
        <property name="c3p0.min_size">5</property>
        <!--在连接池中所有数据库连接的最大数目 -->
        <property name="c3p0.max_size">20</property>
        <!--设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
        <property name="c3p0.timeout">120</property>
        <!--每3000秒检查所有连接池中的空闲连接 以秒为单位 -->
        <property name="c3p0.idle_test_period">3000</property>

        <!--设置事务的隔离级别-->
        <property name="hibernate.connection.isolation">4</property>
        <!--创建一个session绑定到当前线程-->
        <property name="current_session_context_class">thread</property>

        <!--加载映射文件 -->
        <mapping resource="com/xzh/hibernate/domain/customer.hbm.xml" />
        <mapping resource="com/xzh/hibernate/domain/linkman.hbm.xml" />
    </session-factory>
</hibernate-configuration>

五、引入工具类

public class HibernateUtil {
    public static final SessionFactory sessionFactory;
    static {
        //1.加载配置文件
        Configuration configure = new Configuration().configure();
        //2.创建sessionFactory   --JDBC 连接池
        sessionFactory = configure.buildSessionFactory();
    }
    public static Session openSession(){
        Session session = sessionFactory.openSession();
        return  session;
    }
    public static Session getCurrentSession(){
        Session session = sessionFactory.getCurrentSession();
        return  session;
    }

}

六、编写测试类

Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();

Customer customer1 = new Customer();
customer1.setCust_name("customer1");
Customer customer2 = new Customer();
customer2.setCust_name("customer2");
Customer customer3 = new Customer();
customer3.setCust_name("customer3");

Linkman linkman1 = new Linkman();
linkman1.setLink_name("linkman1");
Linkman linkman2 = new Linkman();
linkman2.setLink_name("linkman2");
Linkman linkman3 = new Linkman();
linkman3.setLink_name("linkman3");

/* 配置关系  双向维护*/
customer1.getLinkmens().add(linkman1);
customer1.getLinkmens().add(linkman2);
customer2.getLinkmens().add(linkman3);

linkman1.setCustomer(customer1);
linkman2.setCustomer(customer1);
linkman3.setCustomer(customer2);

/* 保存数据 */
currentSession.save(customer1);
currentSession.save(customer2);
currentSession.save(customer3);

currentSession.save(linkman1);
currentSession.save(linkman2);
currentSession.save(linkman3);

transaction.commit();

懒加载:

在 linkman.hbm.xml 中修改

<many-to-one name="customer" cascade="save-update"
            class="com.xzh.hibernate.domain.Customer" column="link_cust_id" lazy="false"/>

Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
Linkman linkman = currentSession.get(Linkman.class, 3L);
transaction.commit();
System.out.println(linkman.getLink_name());
System.out.println(linkman.getCustomer().getCust_name());

原文地址:https://www.cnblogs.com/xzh0717/p/10808406.html

时间: 2024-09-29 08:19:50

Hibernate 关系配置的相关文章

hibernate关系配置

hibernate中关系的映射有多种,一对一,一对多/多对一,多对多,其中还分单向和双向,其实简单来讲,如果你想获得另一个对象的引用,你就可以在类中定义一个该对象或 该对象的集合.至于表中的关系就是在多方存你的外键而已,如果是多对多,则建立一个中间表,用来存两个关联对象的外键. 一对多&多对一双向 双向关联,在单方设置mapped,将关系由多方主导Group.java @Entity @Table(name="t_group") public class Group { pri

hibernate 关系映射文件配置

<!--Department.hbm.xml users属性,本类与User的一对多 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User" /> </set> <!-- parent属性,本类与Department(上级)的多对一 --> <man

使用annotation配置hibernate(2):一对多关系配置

数据表结构 单向一对多 Student.java 1 @Entity 2 @Table(name = "student") 3 public class Student { 4 @Id 5 @Column(name = "id") 6 @GenericGenerator(name = "generator",strategy = "native") 7 @GeneratedValue(generator = "gen

使用annotation配置hibernate(3):多对多关系配置

数据库表结构 Student.java 1 @Entity 2 @Table(name = "student") 3 public class Student { 4 @Id 5 @Column(name = "id") 6 @GenericGenerator(name = "generator",strategy = "native") 7 @GeneratedValue(generator = "generato

蜗牛—Hibernate之实体关系配置

Hibernate框架很好用,初识的感觉就是,在你配置好的情况下,它可以自动帮你封装实体,也可以自动在你指定的实体内封装另一个实体 下面就来稍微研究一下(以下的字段都必须有set/get方法) 首先看一下我的主要实体类Employee Employee与Department的关系为many-to-one Employee的hbm.xml配置文件如下----- 第一行:name代表的是上图中那个department字段,class不言而喻 第三行:column指的是Employee表中对应的列名

hibernate多对多关系配置--增删改查

hibernate多对多关联配置--并实现增删改查 hibernate就不多介绍了,这里就直接上我项目中使用的例子做说明. 数据模型 这是项目中用户和用户组的数据模型er图草稿,具体的model对象字段就以项目中的为主了. model类以及pojo接口,这里pojo接口用不上,大家测试的时候也可以去掉 package com.supre.model; import java.io.Serializable; import java.util.Set; public class User { pr

hibernate中多表映射关系配置

1.one-to-many一对多关系的映射配置(在一的一方实体映射文件中配置) <!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联删除,删除客户时,级联删除客户关联的联系人 all:级联保存+级联删除 --> <!-- inverse属性:设置是否不维护关联关系 true:不维护关联 false(默认值):维护关联 --> <!-- 一对多 --> <set name="

t3用户-角色-权限hibernate经典配置

[java] view plain copy print? 用户-角色-权限hibernate经典配置. [java] view plain copy print? 既然有人问起,我就写下说明吧.在文章中间的配置文件那里.权当回忆一下,也帮助更多人.这是以前学校时写的,没有注释.都是贴的代码笔记.看到的莫要见怪.欢迎学习交流. [java] view plain copy print? [java] view plain copy print? 首先是三个实体类: [java] view pla

[JavaWeb基础] 005.Hibernate的配置和简单使用

1.Hibernate简介 Hibernate是一个基于Java的开源的持久化中间件,对JDBC做了轻量的封装.采用ORM映射机制,负责实现Java对象和关系数据库之间的映射,把sql语句传给数据库,并且把数据库返回的结果封装成对象.内部封装了JDBC访问数据库的操作,向上层应用提供了面向对象的数据库访问API.以对象的形式操作数据,提高开发效率,不用关心数据库种类(换数据库只要修改配值文件). 2.在MyEclipse上创建一个DB broswer 这个东西你可以从Window -> Show