項目需要構建一個Java環境,使用Hibernate作為數據持久層,一兄弟按照網上的說法配置了hibernate,結果搞了幾天都沒搞好,總是報錯“Could not find datasource”,最后還是我自己動手在自己機器上配個環境才引導他弄好。

要配好Hibernate首先的弄清楚Java在尋找hibernate.cfg.xml這個文件的時候在哪些目錄中尋找,Java將在以下目錄中尋找hibernate.cfg.xml這個文件:
webappsname/WEB-INF/classes/
TOMCATHOME/
TOMCATHOME/lib

所以我們的hibernate.cfg.xml務必放在webapp的WEB-INF/classes/目錄下了,放在其他目錄下都不是很合適。

另外就是關於hibernate.cfg.xml中的jdbc配置了,網上的說法各異,其實最簡單的就是在hibernate.cfg.xml中直接使用jdbc配置了,如下:
<?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.connection.driver_class”>com.mysql.jdbc.Driver</property>
        <property name=”hibernate.connection.url”>jdbc:mysql://localhost/test</property> 
        <property name=”hibernate.connection.username”>root</property> 
        <property name=”hibernate.connection.password” /> 
        <property name=”show_sql”>false</property> 
        <property name=”dialect”>org.hibernate.dialect.MySQLDialect</property> 
        <mapping resource=”hb/Cat.hbm.xml” /> 
    </session-factory>
</hibernate-configuration>

更改其中的driverclass和connection.url、username、password和dialect,再添加一些mapping就可以了,需要注意的是property節點的name屬性中最好在前面加上hibernate。有些文章說使用Tomcat的JNDI,不建議這么做。同時要注意的是在hibernate.cfg.xml不要同時使用datasource和連接字符串兩種配置(那個兄弟非要使用兩種配置結果來不成功),因為沒有必要。

其實從部署的角度來看的話,就應該是這樣的,首先在生產環境下,很多時候是沒有辦法拿到Tomcat的管理權限的是配不了JNDI的,而且要去配JNDI無形增加的部署的難度,在hibernate.cfg.xml中配置連接字符串就很方便部署(Hibernate要是像.net中那樣支持連接字符串加密就好了)。hibernate.cfg.xml存放的位置也是一樣的,放在WEB-INF/classes/目錄下,部署的時候只要拷貝webapp整個目錄就可以完成部署了。

網上的文章用來做參考最好,很多東西還得靠自己領會,特別是碰到問題的時候,盡心書不如無書嘛(也別太相信我寫的,說不定那天不管用了。^_^)。

附:使用Tomcat JNDI 數據源配置方法
<?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.connection.datasource”>java:comp/env/jdbc/odbcq</property>
        <property name=”show_sql”>false</property> 
        <property name=”dialect”>org.hibernate.dialect.MySQLDialect</property> 
        <mapping resource=”hb/Cat.hbm.xml” /> 
    </session-factory>
</hibernate-configuration>