章节索引 :

Hibernate 主配置文件

1. 前言

使用 Hibernate 时,需要经常修改 Hibernate.cfg.xml 主配置文件中的信息, 这些信息至关重要,允许开发者按自己的需求订制使用 Hibernate

本节课程将从 2 个方面帮助大家更好的理解 Hibernate.cfg.xml 主配置文件:

  • 主配置文件的核心作用;
  • 主配置文件中的可配置项有哪些。

2. 配置文件的作用

先了解一下设计模式和设计原则:
设计模式: 通俗讲是一种编程技巧,是一门传承的技术活,能让代码变得有灵性并时时散发出优雅的气息。
设计原则: 是 OOP 编程中需要遵守的设计法则,是使用设计模式的前置条件。

无论是什么框架,只要是和优秀二字挂了边:

  • 框架整体代码设计中必然严格遵循 OOP 的设计原则;
  • 综合使用设计模式让整体代码具有灵活性。

2.1 开闭原则

何谓开闭原则?

开闭原则的自述: 对于一个健壮的、功能完备的系统而言,后期应该允许系统功能的扩展和延伸,但请不要修改核心代码。

可以扩展,但不允许修改代码!这不有点扯吗?如果你觉得有点扯,则说明下面内容对于提升你的编程能力很有用。

笔记本电脑就遵循了开闭原则:

  • 电脑是一个功能完备的硬件系统;
  • 但可通过外置 USB 接口的方式对接各种外部功能设备,任意扩展计算机的现有功能。

那么在程序中一般又是如何实现开闭原则的?

工厂设计模式

程序可通过工厂设计模式的方式实现开闭原则。

如下图所示,这是一个简单工厂的实现过程,帮助需求者 A 创建实现了接口 IB 的 B 对象 。

如果现在有 B1、B2、B3…… 这么一个对象群体,只要它们实现了 IB 接口,通过添加代码,工厂还是可以创建它们。

但是在工厂类设计完毕后又出了实现了 IB 接口的 B3、B4、B5…… 新组件,A 对工厂说,我要使用它们,你帮我创建一下。对于工厂来讲,又不得不修改自己的代码。

那么,有没有一种方式,不修改工厂的内部代码,就能让工厂创建出最近出现的新组件?
当然有,使用配置文件。

2.2 配置文件

如何解决前面的问题?

配置文件

A 把自己对具体组件的需求写入配置文件,工厂对象则:

  • 读取解析配置文件上的信息;
  • 使用反射机制在运行时动态创建 A 所需要的组件。

是不是很完美地解决了开闭原则中自我矛盾的问题。
当然,绝对的开闭是不会出现的,不修改代码,还是需要修改配置文件的,配置文件的套路是实现开闭原则的一种方案。

3. Hibernate 的主配置文件

聊回到 Hibernate,Hibernate 是一个框架,框架只是一个半成品应用程序。需要使用 Hibernate 完成一次具体的数据库数据操作时,需要开发者的组件和 Hibernate 的组件通力合作。

对于 Hibernate 来说,如何知道开发者具体使用什么样的数据库、什么样的持久化对象……

开发者只需要把这些信息写入到配置文件中,Hibernate 就能通过读取配置信息了解开发者的心意。

所以说主配置文件在 Hibernate 和 开发者之间充当了桥梁的作用,是内外交流的通道。

Tips: 通过配置文件,在开发者和 Hibernate 之间进行信息传递,让 Hibernate 能从容面对不同开发者的需求。

你有没有觉得 Hibernate 把开闭原则用得很好呢!

知道了配置文件的作用,现在是时候了解 Hibernate 中的主配置文件能具体传递什么信息了。

3.1 可配置内容

最小需求配置信息:

  • Hibernate 运行的底层信息:数据库的 URL、用户名、密码、JDBC 驱动类,数据库 Dialect, 数据库连接池等;
  • Hibernate 映射文件(*.hbm.xml)或注解类位置。

配置信息远不止上面这些,如缓存信息、事务信息……

主配置文件是开发者和 Hibernate 心灵相连的接口,要让程序在生产环境中工作,需要交流的地方多了。

前面在主配置文件中出现的信息就不再啰嗦!下面罗列部分配置信息内容!不要指望全部记住!!!!

属性名 用途
Hibernate.dialect 针对特定的关系数据库生成优化的 SQL
Hibernate.format_sql 格式化输出 SQL 语句(true,false)
Hibernate.default_schema 将给定的 schema/tablespace 附加到表名上(schema name)
Hibernate.hbm2ddl.auto 自动构建数据库结构,通过映射生成 DDL 语句。
create-drop: 运行时,先创建,运行完,再删除
create: 每次运行前都会删除已存在的再创建。
测试时,可以使用 create
Hibernate.cache.use_query_cache 允许查询缓存,个别查询仍然需要被设置为可缓存的
Hibernate.cache_user_second_level_cache 禁止使用二级缓存,对于在映射中定义中指定的类,会默认开启二级缓存
Hibernate.cahce_query_cache_factory 自定义实现 querycache 接口的类名,默认为内建的 standardQueryCache

Hibernate 主配置文件的格式

Hibernate 提供了一个与配置文件有关的 Configuration 组件,它的功能是:

  • 找到配置文件,读取配置文件内容;

  • 告诉 Hibernate 应该如何响应开发者的请求。

Hibernate 提供有 2 种配置文件格式,格式不同 Configuration 读取时也稍有差异性。

  • 属性文件(hibernate.properties)格式:在实例化 Configuration 组件时,Hiberntae 指定的默认配置文件;
 Configuration cfg = new Configuration();
  • XML 文件(hibernate.cfg.xml)格式:需要显示调用 Configuration 组件的 configure()方法,此方法不带参数时,默认会从 classpath 下寻找是否存在 hibernate.cfg.xml 文件。
 Configuration cfg = new Configuration().configure();

hibernate 官方建议使用 Hibernate.cfg.xml 作为主配置文件名,当然完全可以修改成自己喜欢的名字,修改后读取时则需要使用 Configuration 组件中提供的带参数的 configure()方法。

public Configuration configure(String resource) throws HibernateException ;

建议初学者不要轻易改动。

3.2 编程配置

所谓编程配置,指通过代码的方式添加配置内容,如下代码用编码方式指定映射文件位置:

Configuration cfg = new Configuration().addResource("Student.hbm.xml").addResource("Teacher.hbm.xml");

如下代码中指定的 PO 映射是通过注解方式实现的:

Configuration cfg = new Configuration().addClass(org.mk.po.Studentclass).addClass(org.mk.po.Teacher.class);

当然,除此之外,其它的信息都可以通过编程实现:

Configuration cfg = new Configuration().addClass(org.mk.po.Studentclass).addClass(org.mk.po.Teacher.class).setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test").setProperty("hibernate.order_updates", "true");

至于是否选择编程方式向 Hibernate 进行信息注入,由开发者自行决定。

4. 小结

到了本节内容总结时间,会不会有点依依不舍!

本节课通过讲解开闭原则引出了配置文件的重要性,希望能帮助学习者不仅仅了解配置文件内容有哪些。更重要是帮助学习者了解配置文件在整个框架中的地位及存在的前因后果。

知其然的会忘记,知其所以然的则感同身受。