hibernate配置文件可以有兩種方式:官方推薦的XML配置文件和屬性配置文件。我們大都采用XML方式的配置,因為結構良好,配置靈活,可讀性強。而且可以在XML中直接配置映射文件而屬性文件則不行。但是我們可能忽略的一個問題是:hibernate首先查找的配置文件卻是屬性配置文件hibernate.properties。
看看下面這張圖,就很清楚了。
可以看到Hibernate首先去找了hibernate.properties配置文件,但是沒找到。然后創建字節碼支持器,用到cglib,之后用了時間戳控制,之后才是讀取hibernate.cfg.xml配置文件。這些在最前面的日志信息我們可能會忽略它,但是我們要明白hibernate的一些加載原理。既然Hibernate第一讀取的是屬性配置文件,那么下面我們用屬性配置文件做一個例子來看看效果。
將XML文件打成.bak,加入屬性配置文件,其中的配置和XML相同。
程序中,我們這樣寫就行了。
在控制台,我們就看到這樣的日志信息了。
可以看出,Hibernate直接讀取配置信息,然后是字節碼支持提供,初始化時間戳,加載映射文件,后面的流程就是一樣的了。
hibernate.properties和hibernate.cfg.xml都是Hibernate解析配置文件時默認的命名方式,而且都必須放在類路徑的根目錄下,當然是不建議在使用時修改的,因為這就多此一舉。如果有人不喜歡這種命名方式,當然可以自定義名稱,不過此時你必須告訴Hibernate配置文件是哪個,可以如下方式進行,也是比較方便的。
同時,Hibernate支持在程序中設置新的屬性,比如我們在配置時不設置show_sql和format_sql兩個屬性,那么在程序中也可以設置,如下進行即可。
所有Hibernate中可配置的屬性都是org.hibernate.cfg.Environment類中的一個靜態成員變量。這樣在程序中添加新的屬性了。
org.hibernate.cfg.Configuration類的作用就是解析配置信息和映射信息,之后創建SessionFactory對象,此時配置信息都綁定在SessionFactory中,Configuration就沒有使用價值了。這部分的Hibernate源碼也是比較好理解的。
歡迎交流,希望對使用者有用。
看看下面這張圖,就很清楚了。

可以看到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源碼也是比較好理解的。
歡迎交流,希望對使用者有用。