hibernate配置文件
概要:
与Hibernate相关的配置文件有:hibernate.cfg.xml,hibernate.properties,xxx.hbm.xml(实体类映射文件)等。Hibernate的下载地址:http://hibernate.org/orm/
目录:
- hibernate配置文件
- xxx.hbm.xml(实体类映射文件)
- 读取配置文件
hibernate配置文件
1.hibernate配置文件的读取顺序
hibernate配置文件可以有两种方式:官方推荐的XML配置文件和属性配置文件。我们大都采用XML方式的配置,因为结构良好,配置灵活,可读性强。而且可以在XML中直接配置映射文件而属性文件则不行。但是我们可能忽略的一个问题是:hibernate首先查找的配置文件却是属性配置文件hibernate.properties。
看看下面这张图,就很清楚了。
可以看到Hibernate首先去找了hibernate.properties配置文件,但是没找到。然后创建字节码支持器,用到cglib,之后用了时间戳控制,之后才是读取hibernate.cfg.xml配置文件。这些在最前面的日志信息我们可能会忽略它,但是我们要明白hibernate的一些加载原理。既然Hibernate第一读取的是属性配置文件,那么下面我们用属性配置文件做一个例子来看看效果。
将XML文件打成.bak,加入属性配置文件,其中的配置和XML相同。
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.url=jdbc:oracle:thin:@localhost:1521:orcl
hibernate.connection.username=hibernate
hibernate.connection.password=hibernate
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.current_session_context_class=thread
hibernate.show_sql=true
hibernate.format_sql=true
程序中,我们这样写就行了。
package demo; import java.util.Date; import org.hibernate.*; import org.hibernate.cfg.Configuration; import demo.domain.User; public class Test { public static void main(String[] args) { Configuration config = new Configuration(); config.addResource("demo/domain/User.hbm.xml");// 加载映射文件 // config.addClass(demo.domain.User.class); 另外一种加载方式 SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setName("Sarin"); user.setPhone("15912345678"); user.setDepartment("研发部"); user.setCity("大连"); user.setHireTime(new Date()); session.save(user); tx.commit(); } }
在控制台,我们就看到这样的日志信息了。
可以看出,Hibernate直接读取配置信息,然后是字节码支持提供,初始化时间戳,加载映射文件,后面的流程就是一样的了。
hibernate.properties和hibernate.cfg.xml都是Hibernate解析配置文件时默认的命名方式,而且都必须放在类路径的根目录下,当然是不建议在使用时修改的,因为这就多此一举。如果有人不喜欢这种命名方式,当然可以自定义名称,不过此时你必须告诉Hibernate配置文件是哪个,可以如下方式进行,也是比较方便的。
File file = new File("src/demo/hibernate.xml"); Configuration config = new Configuration(); config.configure(file);
同时,Hibernate支持在程序中设置新的属性,比如我们在配置时不设置show_sql和format_sql两个属性,那么在程序中也可以设置,如下进行即可。
config.setProperty(Environment.SHOW_SQL, "true");
config.setProperty(Environment.FORMAT_SQL, "true");
所有Hibernate中可配置的属性都是org.hibernate.cfg.Environment类中的一个静态成员变量。这样在程序中添加新的属性了。
org.hibernate.cfg.Configuration类的作用就是解析配置信息和映射信息,之后创建SessionFactory对象,此时配置信息都绑定在SessionFactory中,Configuration就没有使用价值了。这部分的Hibernate源码也是比较好理解的。
2.hibernate.properties
hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect hibernate.dialect=org.hibernate.dialect.MySQLMyISAMDialect hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/jdbc hibernate.connection.username=root hibernate.connection.password=123123
注:在Hibernate核心软件包中的project/etc目录下,有一个hibernate.properties文件,它提供了连接各种关系数据库的配置代码样例。
3.hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/jdbc</property> <property name="connection.username">root</property> <property name="connection.password">123123</property> <mapping resource="edu/fjnu/hotelsys/domain/Hotel.hbm.xml"/> <mapping resource="edu/fjnu/hotelsys/domain/Room.hbm.xml"/> </session-factory> </hibernate-configuration>
xxx.hbm.xml(实体类映射文件)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="edu.fjnu.hotelsys.domain"> <class name="Room" table="room"> <id name="roomId" column="room_id" type="java.lang.Integer"> <generator class="increment"/> </id> <property name="roomNo" column="room_no" type="java.lang.String" length="10" not-null="true"/> <property name="roomType" column="room_type" type="java.lang.String" length="1" not-null="true"/> <property name="roomStatus" column="room_status" type="java.lang.String" length="1" not-null="true"/> <property name="roomMemo" column="room_memo" type="java.lang.String" length="200"/> <property name="roomEquipStr" column="room_equip" type="java.lang.String" length="20"/> <many-to-one name="hotel" class="Hotel" column="hotel_no" fetch="join"></many-to-one> </class> </hibernate-mapping>
注:当hibernate下载解压完成之后,我们很容易在解压之后的文件夹中找到配置文件与映射文件的样板范例,文件中对.jar的架包也做了很好的分类。
读取配置文件
1.从 hibernate.cfg.xml 中加载配置,实体映射文件为xml格式
import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ try{ Configuration config = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(config.getProperties()); setSessionFactory(config.buildSessionFactory(builder.build())); }catch(Exception e){ e.printStackTrace(); } } public static void shutdown(){ getSessionFactory().close(); } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void setSessionFactory(SessionFactory sessionFactory) { HibernateUtil.sessionFactory = sessionFactory; } }
2. 从 hibernate.cfg.xml 中加载配置,加载@注解实体类,加载配置文件
import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; /* Hibernate官方提供的Hibernate工具类,主要作用就是返回一个Session。加载@注解配置的实体类需要使用 * @AnnotationConfiguration类。HibernateUtil类包含一个SessionFactory对象。该类初始化时会加载 * hibernate.cfg.xml,并初始化SessionFactory。通过SessionFactory可打开Session会话,对实体类进行操作。 */ public class HibernateUtil { private static final SessionFactory sessionFactory; // 单态模式的SessionFactory对象 static { // static代码块,类加载时初始化Hibernate try { // 从 hibernate.cfg.xml 中加载配置,加载@注解实体类,加载配置文件 sessionFactory = new AnnotationConfiguration().configure( "hibernate.cfg.xml").buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { // 静态方法,返回SessionFactory return sessionFactory; } }
解析:
Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。
在这里,我们看到:要创建一个Configuration,可以使用
Configuration config = new Configuration().configure();
这里我们要明白的是,Configuration是入口,通过它来获得配置文件。
同时Configuration还可以通过指定参数来传递:
下面看:
File file = new File("c:\\Hibernate.xml"); Configuration config = new Configuration().config(file);
同时,Configuration还有一些比较重要的方法:
addProperties();
setProperties();
下面看一下例子:
Properties properties = Porperties.load("a.properties"); Configuration configure = new Configuration().setProperties(properties);
同时还可以指定.hbm.xml文件,下面是几种方法:
addClass();
addFile();
addURL();
下面看一下例子:
Configuration configure = new Configuration().addClass(Order.class); Configuration configure = new Configuration().addURL(Configuration.class.getResource(Order.hbm.xml)); Configuration configure = new Configuration().addFile("Order.hbm.xml");
下面简单的看一下SessionFactory类
首先看一下代码
Configuration configure = new Configuration().configure(); SessionFactory sessions = configure.buildSessionFactory();
这里要说明的是,SessionFactory是线程安全的,可以被多个线程调用。在我们实际开发中,我们可以在初始化的部分构造一个 SessionFactory即可,比如,在一个公共静态类中初始化一个SessionFactory的readonly常量等等。它充当数据存储源的代 理。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
参考文章:http://www.cnblogs.com/xiohao/p/4150293.html
http://www.cnblogs.com/black-snail/p/3767548.html