Java程序員從笨鳥到菜鳥之(七十九)細談Spring(八)spring+hibernate整合基本詳解

由於SpringHibernate處於不同的層次,Spring關心的是業務邏輯之間的組合關係,Spring提供了對他們的強大的管理能力, 而Hibernate完成了OR的映射,使開發人員不用再去關心SQL語句,直接與對象打交道。 將Hibernate做完映射之後的對象交給Spring來管理是再合適不過的事情了, Spring也同時提供了對HibernateSessionFactory的集成功能。所以spring+hibernate整合對我們實際開發是非常有必要的。Spring整合hibernate有多種方式,我用的只是其中的一種,我這種不需要hibernate的配置文件,直接配置我們的beans.xml裏了。下面我們具體來看一下:

首先我們先把需要的實體類定義出來,我這裏定義的是:


  1. <span style="font-size:18px;">Users.java:  
  2. public class Users {  
  3. private int id;  
  4. private String name;  
  5. public int getId() {  
  6. return id;  
  7. }  
  8. public void setId(int id) {  
  9. this.id = id;  
  10. }  
  11. public String getName() {  
  12. return name;  
  13. }  
  14. public void setName(String name) {  
  15. this.name = name;  
  16. }  
  17. }</span>  


       這裏我們整合spring+hibernate主要是來整合的細節,業務邏輯和分層在此就忽略不計了,我直接把所有的東西都寫在了test類裏面了。

下面我們來看一下我們的beans.xml的配置,我們先把代碼貼出來,然後再下面一點點的深入詳解:

Beans.xml

  1. <span style="font-size:18px;color:#008080;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4. xmlns:tx="http://www.springframework.org/schema/tx"  
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6. http://www.springframework.org/schema/tx   
  7.            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  8. "></span>  
  1. <span style="font-size:18px;color:#008080;">//配置數據庫相關信息,配置數據源,它將會被注入到sessionfactory中  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  3. destroy-method="close">  
  4. <propertynamepropertyname="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />  
  5. <property name="url"  
  6. value="jdbc:sqlserver://localhost:1433; DatabaseName=test" />  
  7. <property name="username" value="sa"></property>  
  8. <property name="password" value="123456"></property>  
  9. </bean>  
  10. //構建sessionfactory的bean,爲把sessionfactory注入到dao層構建bean  
  11. <bean id="sessionFactory"  
  12. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"  
  13. lazy-init="false">  
  14. //注入datasource,給sessionfactoryBean內setdatasource提供數據源  
  15. <property name="dataSource">  
  16. <ref bean="dataSource" />  
  17. </property>  
  18. //加載實體類的配置文件  
  19. <property name="mappingResources">  
  20. <list>  
  21. <value>com/bzu/test/Users.hbm.xml</value>  
  22. <value>com/bzu/test/Log.hbm.xml</value>  
  23. </list>  
  24. </property>  
  25. //設置hibernate的屬性,相當於hibernate.cfg.xml中的設置屬性  
  26. <property name="hibernateProperties">  
  27. <props>  
  28. <prop key="hibernate.dialect">  
  29. org.hibernate.dialect.SQLServerDialect  
  30. </prop>  
  31. <prop key="hbm2ddl.auto">update</prop>  
  32. <prop key="hibernate.show_sql">true</prop>  
  33. </props>  
  34. </property>  
  35. </bean>  
  36. //把sessionfactory注入dao層  
  37. <bean id="test" class="com.bzu.test.test" lazy-init="false">  
  38. <property name="sessionFactory" ref="sessionFactory"></property>  
  39. </bean>  
  40. </beans></span>  


通過上面的註釋我想大家應該大體對這個配置文件明白些了吧。其實這個也很好理解,大體思路就是首先寫一個datasourcebean,這個bean主要是爲hibernate提供數據源,大家肯定可以想到這個數據源將會被注入到sessionfactory裏面,因爲構建sessionfactory肯定會需要到這個數據源的信息。

下一步我們在寫一個sessionfactorybean,這個bean將被我們用在注入到dao層,進行數據庫操作,當然,他還需要一些屬性進行注入,比如我們剛纔寫的datasource,除了這個之外我們還需要配置我們的實體,spring給我們提供了hbm文件和實體類等多種配置方法。Hbm文件配置我們這樣寫:

  1. <span style="font-size:18px;color:#008080;"><property name="mappingResources">  
  2. <list>  
  3. <value>com/bzu/test/Users.hbm.xml</value>  
  4. <value>com/bzu/test/Log.hbm.xml</value>  
  5. </list>  
  6. </property></span>  


屬性值爲mappingResources,這個屬性值是一個list,我們可以配置他的value,把我們的配置文件一個個的加入進來。如果你沒有寫配置文件,而是以註解的方式配置的實體類,你當然也可以以實體類的形式加到這裏來:你可以以下方式進行配置:把屬性的name設置成annotatedClasses

  1. <span style="font-size:18px;"><property name="annotatedClasses">  
  2. <list>  
  3. <value>com.bzu.model.User</value>  
  4. <value>com.bzu.model.Log</value>  
  5. </list>  
  6. </property></span>  


      說完配置sessionfactory的的實體,下一步我們還要配置hibernate的的一些屬性,比如創建數據庫表的方式、數據庫方言等。設置hibernate的屬性,我們用hibernateProperties來配置,配置方式,上面代碼已經很清楚的寫到了,在這就不贅述了。

好了,配置完sessionfactory這個bean,下一步我們就要把sessionfactory注入到我們的dao層進行數據庫操作了。這一步就比較簡單了,相信大家能看懂上面的代碼。

看完配置文件,接下來我們就要來測試一下來,試試能不能用hibernate對我們的數據庫進行訪問了。具體來看一下代碼:

  1. <span style="font-size:18px;color:#7f0055;">package com.bzu.test;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.SessionFactory;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import org.springframework.transaction.annotation.Transactional;  
  6. public class test {  
  7. private static SessionFactory sessionFactory;  
  8. public SessionFactory getSessionFactory() {  
  9. return sessionFactory;  
  10. }  
  11. public void setSessionFactory(SessionFactory sessionFactory) {  
  12. this.sessionFactory = sessionFactory;  
  13. }  
  14. public static void main(String[] args) throws Exception {  
  15. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(  
  16. "beans.xml");  
  17. Session session = sessionFactory.openSession();  
  18. // ((SessionFactory) ctx.getBean("sessionFactory")).openSession();  
  19. Users user = new Users();  
  20. user.setName("nihao");  
  21. session.save(user);  
  22. }  
  23. }</span>  


   大家可以清楚的看到,上面的內容很簡單,我們寫具體的架構的東西,直接把sessionfactory注入到了test類了,當然了,我們實際開發應用中不會手動的去加載beans.xml的,這裏主要是爲了測試,測試一下:

打印出sql語句:

Hibernate: insert into users (name) values (?)

好了,基本上我們這個hibernate+spring整合的差不多了。但在調試這個程序的時候還是出了點小差錯,最後弄了半天才發現錯誤所在,我剛開始寫的時候,是把main裏面的操作都抽出一個方法了,然後再main方法中我是這樣調用的new Test().sava(user),直接就出事了。異常的原因就是我new出來的test的對象就不受spring容器管理了,所以在調用save方法時根本sessionfactory就沒有被注入進去,所以希望大家注意這一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章