Hibernate【查询详解、连接池、逆向工程】(二)

简介: Hibernate【查询详解、连接池、逆向工程】

Hibernate连接池

Hibernate自带了连接池,但是呢,该连接池比较简单..而Hibernate又对C3P0这个连接池支持…因此我们来更换Hibernate连接池为C3P0

查看Hibernate自带的连接池

我们可以通过Hibernate.properties文件中查看Hibernate默认配置的连接池

hibernate.properties的配置文件可以在\project\etc找到

Hibernate的自带连接池啥都没有,就一个连接数量为1

微信图片_20220221132221.jpg这里写图片描述


查看Hibernate对C3P0的支持

  • #hibernate.c3p0.max_size 2                最大连接数
  • #hibernate.c3p0.min_size 2                最小连接数
  • #hibernate.c3p0.timeout 5000           超时时间
  • #hibernate.c3p0.max_statements 100     最大执行的命令的个数
  • #hibernate.c3p0.idle_test_period 3000    空闲测试时间
  • #hibernate.c3p0.acquire_increment 2     连接不够用的时候, 每次增加的连接数
  • #hibernate.c3p0.validate false

微信图片_20220221132223.jpg这里写图片描述

修改Hibernate连接池

我们在hibernate.cfg.xml中配置C3p0,让C30P0作为Hibernate的数据库连接池

查找Hibernate支持的连接池组件有什么

微信图片_20220221132225.jpg这里写图片描述

既然找到了,那么我们在hibernate.cfg.xml中配置对应的类就和相关配置就行了


<!-- 【连接池配置】 -->
        <!-- 配置连接驱动管理类 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- 配置连接池参数信息 -->
        <property name="hibernate.c3p0.min_size">2</property>
        <property name="hibernate.c3p0.max_size">4</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        <property name="hibernate.c3p0.idle_test_period">30000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

线程Session使用


我们创建Session的时候,有两个方法


  • openSession()【每次都会创建新的Session】
  • getCurrentSession()【获取当前线程的Session,如果没有则创建】

一般地,我们使用线程Session比较多

如果要使用getCurrentSession(),需要在配置文件中配置:


<!--配置线程Session-->
        <property name="hibernate.current_session_context_class">thread</property>

测试数据


@Test
    public void testSession() throws Exception {
        //openSession:  创建Session, 每次都会创建一个新的session
        Session session1 = sf.openSession();
        Session session2 = sf.openSession();
        System.out.println(session1 == session2);
        session1.close();
        session2.close();
        //getCurrentSession 创建或者获取session
        // 线程的方式创建session  
        // 一定要配置:<property name="hibernate.current_session_context_class">thread</property>
        Session session3 = sf.getCurrentSession();// 创建session,绑定到线程
        Session session4 = sf.getCurrentSession();// 从当前访问线程获取session
        System.out.println(session3 == session4);
        // 关闭 【以线程方式创建的session,可以不用关闭; 线程结束session自动关闭】
        //session3.close();
        //session4.close(); 报错,因为同一个session已经关闭了!
    }

为什么要使用逆向工程

由于我们每次编写Hibernate的时候都需要写实体,写映射文件。而且Hibernate的映射文件也容易出错。而逆向工程可以帮我们自动生成实体和映射文件,这样就非常方便了。

使用PowerDesigner

在设计数据库表时,我们使用PowerDesigner来生成概念模型\物理模型…

设计一个人员组织架构:有机构、部门、员工、领导、角色、权限。

  • 一个机构有多个部门
  • 一个部门有多个员工
  • 领导可以管理多个部门,同时领导他自己也是员工
  • 一个员工可以有多个角色
  • 一个角色可以分配给多个人
  • 人员角色分配后可以设置是否有效,分配时间等
  • 一个角色有多个权限

概念模型:

微信图片_20220221132228.jpg这里写图片描述

在PowerDesigner中,箭头指向的方向永远是“一”的一方

生成物理模型:

微信图片_20220221132230.jpg这里写图片描述

微信图片_20220221132232.jpg

这里写图片描述

最后生成物理模型是这样子的:

微信图片_20220221132235.jpg这里写图片描述

生成sql语句

我们可以单个生成,一个一个复制

微信图片_20220221132237.jpg这里写图片描述

也可以把整个物理模型的sql语句一起生成:

微信图片_20220221132240.jpg这里写图片描述

/*==============================================================*/
    /* DBMS name:      MySQL 5.0                                    */
    /* Created on:     2017/6/5 20:22:52                            */
    /*==============================================================*/
    drop table if exists person_role;
    drop table if exists t_company;
    drop table if exists t_dept;
    drop table if exists t_employee;
    drop table if exists t_person;
    drop table if exists t_privilege;
    drop table if exists t_role;
    drop table if exists t_role_privilege;
    /*==============================================================*/
    /* Table: person_role                                           */
    /*==============================================================*/
    create table person_role
    (
       person_id            varchar(32) not null,
       role_id              varchar(32) not null,
       state                varchar(32),
       primary key (person_id, role_id)
    );
    /*==============================================================*/
    /* Table: t_company                                             */
    /*==============================================================*/
    create table t_company
    (
       company_id           varchar(32) not null,
       name                 varchar(32),
       primary key (company_id)
    );
    /*==============================================================*/
    /* Table: t_dept                                                */
    /*==============================================================*/
    create table t_dept
    (
       dept_id              varchar(32) not null,
       company_id           varchar(32) not null,
       name                 varchar(32),
       primary key (dept_id)
    );
    /*==============================================================*/
    /* Table: t_employee                                            */
    /*==============================================================*/
    create table t_employee
    (
       person_id            varchar(32) not null,
       dept_id              varchar(32),
       name                 varchar(32),
       employee_id          varchar(32),
       primary key (person_id)
    );
    /*==============================================================*/
    /* Table: t_person                                              */
    /*==============================================================*/
    create table t_person
    (
       person_id            varchar(32) not null,
       dept_id              varchar(32) not null,
       name                 varchar(32),
       primary key (person_id)
    );
    /*==============================================================*/
    /* Table: t_privilege                                           */
    /*==============================================================*/
    create table t_privilege
    (
       privilege_id         varchar(32) not null,
       name                 varchar(32),
       primary key (privilege_id)
    );
    /*==============================================================*/
    /* Table: t_role                                                */
    /*==============================================================*/
    create table t_role
    (
       role_id              varchar(32) not null,
       name                 varchar(32),
       primary key (role_id)
    );
    /*==============================================================*/
    /* Table: t_role_privilege                                      */
    /*==============================================================*/
    create table t_role_privilege
    (
       role_id              varchar(32) not null,
       privilege_id         varchar(32) not null,
       primary key (role_id, privilege_id)
    );
    alter table person_role add constraint FK_person_role foreign key (person_id)
          references t_person (person_id) on delete restrict on update restrict;
    alter table person_role add constraint FK_person_role2 foreign key (role_id)
          references t_role (role_id) on delete restrict on update restrict;
    alter table t_dept add constraint FK_companty_dept foreign key (company_id)
          references t_company (company_id) on delete restrict on update restrict;
    alter table t_employee add constraint FK_inherit foreign key (person_id)
          references t_person (person_id) on delete restrict on update restrict;
    alter table t_person add constraint FK_dept_person foreign key (dept_id)
          references t_dept (dept_id) on delete restrict on update restrict;
    alter table t_role_privilege add constraint FK_belong foreign key (role_id)
          references t_role (role_id) on delete restrict on update restrict;
    alter table t_role_privilege add constraint FK_own foreign key (privilege_id)
          references t_privilege (privilege_id) on delete restrict on update restrict;

在数据库生成八张表:

微信图片_20220221132242.jpg

这里写图片描述


在Idea下使用Hibernate逆向工程

微信图片_20220221132245.jpg这里写图片描述

值得注意的是:Intellij idea下生成出来的映射文件是没有对应的关联关系的。也就是说:一对多或多对多的关系,它是不会帮你自动生成的【好像是这样子的】。。。因此,需要我们自己添加Set【如果需要】

更新,如果想要体现对应的关联关系的话,请参考该博文!

目录
相关文章
|
5月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
163 0
|
5月前
|
SQL Java 数据库连接
|
5月前
|
缓存 Java 数据库连接
什么是 Hibernate 查询语言或 HQL?
【8月更文挑战第21天】
148 0
|
5月前
|
SQL Java 数据库连接
在 Hibernate 中何时使用条件查询?
【8月更文挑战第21天】
59 0
|
5月前
|
缓存 Java 数据库连接
Hibernate 中的查询缓存是什么?
【8月更文挑战第21天】
47 0
|
5月前
|
SQL 安全 Java
|
8月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(Emp.hbm.xml)
Hibernate中使用Criteria查询及注解——(Emp.hbm.xml)
|
8月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——( EmpCondition)
Hibernate中使用Criteria查询及注解——( EmpCondition)
|
8月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(DeptTest.java)
Hibernate中使用Criteria查询及注解——(DeptTest.java)
|
8月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(Emp.java)
Hibernate中使用Criteria查询及注解——(Emp.java)