SessionFactory sessionFactory = AnnotationConfiguration().configure().buildSessionFactory();
如果配合Spring的話,就可以使用注入的概念將SessionFactory注入到要使用SessionFactory的類別中。
整合Spring與Hibernate有兩種方法:
- 在Spring配置中直接將原Hibernate的配置檔抓進來。
- 在Spring自己配置Hibernate的配置、連接池(例如C3P0)等,可以捨棄原來的Hibernate配置檔,也可把它抓進來,然後覆蓋部份配置。
讓我們再一次看一次原來的Hibernate配置檔,hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/smarthomeprojectdatabase?zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">pass</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- 使用ASTQueryTranslatorFactory才可以Inser, Delete, Update -->
<property name="hibernate.query.factory_class">org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory</property>
<!--==============C3P0的配置=============-->
<!-- 最小連接數 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 最大連接數 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 多久會把無用的連接視為timeout並移除到min_size的連接數量,單位毫秒 -->
<property name="hibernate.c3p0.timeout">300</property>
<!-- 最大的PreparedStatement的數量 -->
<property name="hibernate.c3p0.max_statements">50</property>
<!-- 多久進行空閒連接的檢查,確定連接還存在,例如有無被Database端關掉,單位是秒-->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!--======================================-->
<mapping resource="DatabaseFunction/SmartDevices.hbm.xml"/>
</session-factory>
</hibernate-configuration>
可以看到除了Hibernate自己配置外,也加上了C3P0連接池的配置。接著我們在看一下要使用SessionFactory的類別,HibernateUtil.java:
package DatabaseFunction;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static SessionFactory sessionFactory = null;
public HibernateUtil(SessionFactory sessionFactory) {
try {
this.sessionFactory = sessionFactory;
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
<bean class="DatabaseFunction.HibernateUtil">
<constructor-arg ref="sessionFactory" />
</bean>
現在開始演示兩種整合Spring與Hibernate的方法:
- 在Spring配置中直接將原Hibernate的配置檔抓進來:
- 在Spring自己配置Hibernate的配置、連接池(例如C3P0)等,可以捨棄原來的Hibernate配置檔,也可把它抓進來,然後覆蓋部份配置:
在Spring的配置檔,例如applicationContext.xml中,我們可以加入以下的Bean:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
其中"configLocation"表示把Hibernate的hibernate.cfg.xml設定檔設定到id為sessionFactory的Bean之名為configLocation的屬性中,而該Bean為LocalSessionFactoryBean的實體。
我們也可以在Spring的配置檔中,例如applicationContext.xml中直接設定連接池及Hibernate配置,首先我們先來加入C3P0的池接池設定,其中各項屬性的設定都可對應到之前的C3P0設定:
<!-- C3P0連接池的配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/smarthomeprojectdatabase?zeroDateTimeBehavior=convertToNull" />
<property name="user" value="user" />
<property name="password" value="pass" />
<property name="maxPoolSize" value="20" />
<property name="minPoolSize" value="5" />
<property name="maxStatements" value="50" />
<property name="idleConnectionTestPeriod" value="300" />
</bean>
再來我們加上Hibernate的設定,其中dataSource屬性參考到C3P0配置Bean的id:
<!-- Hibernate的配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" destroy-method="destroy">
<!-- 指定數據源,此處是C3P0連接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 指定ORM物件關聯表映射檔的設定檔位置 -->
<property name="mappingResources">
<list>
<value>DatabaseFunction/SmartDevices.hbm.xml</value>
</list>
</property>
<!-- 捨棄原hibernate.cfg.xml檔或
覆蓋原hibernate.cfg.xml檔的部份設定 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory</prop>
</props>
</property>
</bean>
這樣就配置完成了,其中的各項Hibernate配置也都可以跟原來的hibernate.cfg.xml對應上,此時已經完全可以不用hibernate.cfg.xml也可也使用Spring幫我們注入的SessionFactory了當然也可以保留hibernate.cfg.xml,並向第一種方法那樣,利用"configLocation"屬性來指定hibernate.cfg.xml,此時Spring中有設定的Hibernate屬性將會覆蓋原hibernate.cfg.xml的重覆屬性。
參考資料:
沒有留言 :
張貼留言