與Hibernate相關的配置文件有:hibernate.cfg.xml,hibernate.properties,xxx.hbm.xml(實體類映射文件)等。Hibernate的下載地址:http://hibernate.org/orm/
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>
<?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