最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring結合hibernate示例詳解

 更新時間:2017年09月14日 11:03:45   作者:動力節(jié)點  
這篇文章主要介紹了spring結合hibernate結合,需要的朋友可以參考下

單純Hibernate程序

1、首先是導入hibernate的jar包。

2、 建立用戶和用戶操作記錄實體,Log.Java和User.java。代碼如下所示。

Log.java

import java.util.Date; 
public class Log { 
  private int id; 
  //日志的類別.日志一般起到一個不可否認性. 
  //操作日志 安全日志 事件日志. 
  private String type; 
  private String detail; 
  private Date time; 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getType() { 
    return type; 
  } 
  public void setType(String type) { 
    this.type = type; 
  } 
  public String getDetail() { 
    return detail; 
  } 
  public void setDetail(String detail) { 
    this.detail = detail; 
  } 
  public Date getTime() { 
    return time; 
  } 
  public void setTime(Date time) { 
    this.time = time; 
  } 
} 

User.java

public class User { 
  private int id; 
  private String name; 
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
} 

3、 并建立與之對應的實體配置文件,Log.hbm.xml和Use.hbm.xml。代碼如下所示。

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
  <class name="com.bjpowernode.usermgr.domain.User" table="t_user"> 
    <id name="id" > 
      <generator class="native"/> 
    </id> 
    <property name="name" /> 
  </class> 
</hibernate-mapping> 

Log.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
  <class name="com.bjpowernode.usermgr.domain.Log" table="t_log"> 
    <id name="id" > 
      <generator class="native"/> 
    </id> 
    <property name="type" /> 
    <property name="detail" /> 
    <property name="time" /> 
  </class> 
</hibernate-mapping> 

4、Manager層代碼如下所示。

LogManager.java接口

public interface LogManager { 
  //添加日志.方法 
  public void addLog(Log log); 
} 

LogManagerImpl實現(xiàn)

public class LogManagerImpl implements LogManager { 
  @Override 
  public void addLog(Log log) {  
    HibernateUtils.getSessionFactory().getCurrentSession().save(log); 
     
  } 
}

UserManager接口

public interface UserManager { 
 
  public void addUser(User user); 
} 

UserManagerImpl.java實現(xiàn)

public class UserManagerImpl implements UserManager { 
  @Override 
  public void addUser(User user) { 
    Session session = null; 
    try { 
      //這個session中是放到threadlocal. 
      session = HibernateUtils.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 
      // 網(wǎng)用戶表中添加一條同時網(wǎng)日志中添加一條. 
      session.save(user); 
      Log log = new Log(); 
      log.setType("操作日志"); 
      log.setTime(new Date()); 
      log.setDetail("xxx"); 
      LogManager logManager = new LogManagerImpl(); 
      //添加日志. 
      logManager.addLog(log); 
      session.getTransaction().commit(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally{ 
      HibernateUtils.closeSession(session); 
    } 
  } 
} 

5、是通過sessionFactory來創(chuàng)建session,通過session來開啟提交和關閉回滾事務,我們把session的開啟關閉封裝到一個工具類中。HibernateUtils.java代碼如下所示。

public class HibernateUtils { 
  private static SessionFactory factory; 
  static { 
    try { 
      //讀取hibernate.cfg.xml文件 
      Configuration cfg = new Configuration().configure(); 
      //建立SessionFactory 
      factory = cfg.buildSessionFactory(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
    } 
  } 
  public static Session getSession() { 
    return factory.openSession(); 
  }  
  public static void closeSession(Session session) { 
    if (session != null) { 
      if (session.isOpen()) { 
        session.close(); 
      } 
    } 
  } 
  public static SessionFactory getSessionFactory() { 
    return factory; 
  } 
} 

6、配置hibernate.cfg.xml文件,包括數(shù)據(jù)庫名稱,數(shù)據(jù)庫關聯(lián)的表,以及用戶名密碼等。代碼如下所示。

<hibernate-configuration> 
  <session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring_hibernate_1</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <!--  
    <property name="hibernate.current_session_context_class">jta</property> 
    --> 
    <mapping resource="com/bjpowernode/usermgr/domain/User.hbm.xml"/> 
    <mapping resource="com/bjpowernode/usermgr/domain/Log.hbm.xml"/> 
  </session-factory> 
</hibernate-configuration> 

7、 使用junit進行單元測試,代碼如下所示。

import junit.framework.TestCase; 
public class UserManagerImplTest extends TestCase { 
  public void testAddUser() { 
    UserManager userManager = new UserManagerImpl(); 
    User user = new User(); 
    user.setName("張三"); 
    userManager.addUser(user); 
  } 
} 

在上述操作用,對事物的控制邊界在業(yè)務邏輯層,因為在UserManagerImpl中我們調(diào)用addUser()這一方法的同時要把這一操作寫入到日志中,也就是調(diào)用了addLog()方法,而對于類的方法,一方法一session,一session一事務,那么如果控制事務的呢?我們要執(zhí)行開啟addUser()事務同時再開啟addLog()事務嗎?在這里我們沒有再用以前的openSession方法,選擇用的HibernateUtils.getSessionFactory().getCurrentSession();同時在hibernate.cfg.xml中對getCurrentSession()進行配置如下,       <propertyname="hibernate.current_session_context_class">thread</property>表示在當前線程中,與當前線程綁定這樣執(zhí)行addUser()方法和addLog()方法使用的是同一個事務。

那OpenSession和getCurrentSession的區(qū)別呢?

1、          openSession必須關閉,currentSession在事務結束后自動關閉。

2、          openSession沒有和當前線程綁定,currentSession和當前線程綁定。并且使用currentSession需要在我們的hibernate.cfg.xml文件中進行事務的配置,是使用Jdbc事務還是JTA事務。

hibernate和spring結合使用

我們從上述例子中發(fā)現(xiàn),hibernate的事務是獨立于hibernate對數(shù)據(jù)庫的增刪改查的,并且事務控制在我們的業(yè)務邏輯層,對于獨立的東西,像是橫切性問題,自然想到了AOP,實際上SpringAOP封裝了對事務的管理,使用SpringAOP我們不再負責去開啟和關閉事務。

下面用SpringAOP來和hibernate結合。

當然也要導入Spring相關jar。

對于事務管理就是一個橫切性問題,把事務管理模塊化就是我們的aspect,然后再配置文件中進行配置,我們可以把事務單獨放到一個配置文件中。

1、代碼如下,applicationContext-common.xml文件。

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 
  <!-- 配置SessionFactoyr --> 
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
    </property> 
  </bean> 
  <!-- 配置事務管理器 --> 
  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
      <ref bean="sessionFactory"/> 
    </property> 
  </bean> 
<!-- 哪些類哪些方法使用事務. -->  
<aop:config> 
  <aop:pointcut id="allManagerMethod" expression="execution(* com.bjpowernode.usermgr.manager.*.*(..))"/> 
  <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/> 
</aop:config> 
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
  <tx:attributes> 
    <tx:method name="add*" propagation="REQUIRED"/> 
    <tx:method name="del*" propagation="REQUIRED"/> 
    <tx:method name="modify*" propagation="REQUIRED"/> 
    <tx:method name="*" propagation="REQUIRED" read-only="true"/> 
  </tx:attributes> 
</tx:advice> 
</beans> 

首先是配置的是sessionFactory,讓spring拿到hibernate的sessionFactory,以便對hibernate事務控制,通過sessionFactory產(chǎn)生session再訪問。這樣就把把hibernate的sessionFactory注入到Spring中了。通過<property>標簽,告訴SpringHibernate的配置文件在哪里,以便spring可以讀取hibernate的配置文件。
其次是配置事務管理器,把我們的sessionFactory注入給事務管理器,讓事務管理器管理事務。

其次,到底是哪些類哪些方法,開始執(zhí)行的時候執(zhí)行事務,<aop:pointcutid="allManagerMethod"  

其次,配置AOP,expression="execution(*com.bjpowernode.usermgr.manager.*.*(..))",到底是哪些類交給spring完成事務管理?我們應用在所有的manager包中的所有方法上,manager所有類所有方法全部參與事務的運行。那在什么地方觸發(fā)開啟事務?

再次,定義一個Advice,配置事務的傳播特性,例如addUser()中調(diào)用addLog()方法,是在同一個事務還是不在同一個事務。以add開頭,del開頭,modify開頭以及其他,我們配置的事務傳播特性為propagation="REQUIRED",這樣在一個方法中調(diào)用另一個方法他們公共一個線程。

2、讓UserManagerImpl繼承spring提供的對hibernateDao支持類。

HibernateDaoSupport,這樣繼承之后我們就能拿到session,其實也就是hibernate中的session,只不過spring為我們封裝了。我們可以這樣拿到sesion:This.getSession().save(user);或者使用spring封裝好的對象:

This.getHibernateTemplate().save(user);這樣都封裝到里面了,我們不管理事務的開啟和關閉。

之前在我們的UserManagerImpl中使用了LogManagerImpl實例,這次我們可以使用Spring的IOC容器,把他們之間的依賴關系注入到Spring中,這樣就看不到實例,面對接口編程,進行了解耦。

接口不變,UserManagerImpl.java代碼如下所示。

public class UserManagerImpl extends HibernateDaoSupport implements UserManager { 
  private LogManager logManager; 
  public void setLogManager(LogManager logManager) 
  { 
    this.logManager = logManager; 
  } 
  @Override 
  public void addUser(User user)throws Exception { 
    //this.getSession().save(user); 
        //或者用. 
        this.getHibernateTemplate().save(user); 
        Log log = new Log(); 
        log.setType("操作日志"); 
        log.setTime(new Date()); 
        log.setDetail("xxx"); 
        //LogManager logManager = new LogManagerImpl(); 
        //添加日志. 
        logManager.addLog(log);        
        //運行期的異常,會回滾. 并且是他的子類也會回滾. 
        //throw new RuntimeException(); 
        //throw new Exception(); 
  } 
} 

LogManagerImpl.java 代碼如下所示。

public class LogManagerImpl extends HibernateDaoSupport implements LogManager { 
  @Override 
  public void addLog(Log log) { 
    //getSession().save(log); 
    this.getHibernateTemplate().save(log); 
     
  } 
} 

刪除我們自己建立的HibernateUtils.java類,刪除hibernate.cfg.xml文件中對getCurrentSession()的事務配置。

3、在配置文件中配置依賴關系。

applicationContext-beans.xml代碼如下所示。

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 
  <bean id="userManager" class="com.bjpowernode.usermgr.manager.UserManagerImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    <property name="logManager" ref="logManager"/> 
  </bean> 
  <bean id="logManager" class="com.bjpowernode.usermgr.manager.LogManagerImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
  </bean> 
</beans> 

在Junit中測試程序代碼如下所示。

public class UserManagerImplTest extends TestCase { 
  public void testAddUser() { 
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");  
    UserManager userManager = (UserManager) factory.getBean("userManager"); 
    User user = new User(); 
    user.setName("張三"); 
    try { 
      userManager.addUser(user); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
} 

顯示結果如下圖所示。


    這樣就完成了spring和hibernate的結合,主要是利用SpringAOP對hibernate的事務進行控制和在Manager層之間的調(diào)用用Spring IOC進行控制。

總結

以上所述是小編給大家介紹的spring結合hibernate示例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Java反轉鏈表測試過程介紹

    Java反轉鏈表測試過程介紹

    這篇文章主要介紹了Java反轉鏈表測試過程,學習過數(shù)據(jù)結構的小伙伴們,對鏈表想來是并不陌生。本篇文章將為大家介紹幾種在Java語言當中,實現(xiàn)鏈表反轉的幾種方法,以下是具體內(nèi)容
    2023-04-04
  • DecimalFormat數(shù)字格式化用法詳解

    DecimalFormat數(shù)字格式化用法詳解

    這篇文章主要為大家詳細介紹了DecimalFormat數(shù)字格式化用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Android中PreferenceActivity使用詳解

    Android中PreferenceActivity使用詳解

    本文主要介紹了Android中PreferenceActivity使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java迭代器與Collection接口超詳細講解

    Java迭代器與Collection接口超詳細講解

    Collection也稱集合,集合概述:集合是Java中提供的一種容器,可以用來存儲多個數(shù)據(jù)。Iterator(迭代器)不是一個集合,它是一種用于訪問集合的方法,可用于迭代 ArrayList 和 HashSet 等集合
    2022-07-07
  • java web圖片上傳和文件上傳實例詳解

    java web圖片上傳和文件上傳實例詳解

    這篇文章主要介紹了java web圖片上傳和文件上傳實例詳解的相關資料,這里提供了兩種方法及示例代碼,需要的朋友可以參考下
    2016-11-11
  • Springboot詳解實現(xiàn)食品倉庫管理系統(tǒng)流程

    Springboot詳解實現(xiàn)食品倉庫管理系統(tǒng)流程

    這是一個使用Springboot開發(fā)的食品倉庫管理系統(tǒng),是為商家提供商品貨物進銷存的信息化管理系統(tǒng),具有一個倉庫管理系統(tǒng)該有的所有功能,感興趣的朋友快來看看吧
    2022-06-06
  • Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    Spring Boot利用Thymeleaf發(fā)送Email的方法教程

    spring Boot默認就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實現(xiàn)

    SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實現(xiàn)

    這篇文章主要介紹了SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Maven中exec插件執(zhí)行Java程序的實現(xiàn)

    Maven中exec插件執(zhí)行Java程序的實現(xiàn)

    在Maven項目中,可以使用Maven的插件來執(zhí)行Java程序,本文主要介紹了Maven中exec插件執(zhí)行Java程序的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 淺談C#與Java兩種語言的比較

    淺談C#與Java兩種語言的比較

    今天小編就為大家分享一篇關于淺談C#與Java兩種語言的比較,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論

冀州市| 定边县| 财经| 资中县| 来宾市| 双江| 武川县| 毕节市| 博乐市| 都江堰市| 齐齐哈尔市| 定州市| 嘉义县| 肃宁县| 正镶白旗| 莱芜市| 大名县| 上饶县| 娱乐| 安顺市| 顺昌县| 定远县| 棋牌| 都匀市| 蛟河市| 宁安市| 边坝县| 牙克石市| 西吉县| 益阳市| 甘泉县| 辽源市| 平利县| 陇西县| 潞城市| 吴堡县| 兴国县| 新龙县| 武清区| 高雄县| 自治县|