




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、給你詳細講一下 SSH 框架的事物管理,希望對你有幫助。Struts+hibernate+spring 整合開發(fā) web 應用是相當流行的,只需要簡單的配置 就能輕松的對數(shù)據(jù)庫進行 crud 操作,下面就 hibernate spring 的配置做一下剖 析,一邊與大家一起分享經(jīng)驗:1、準備工作:</property><property name="hibernateProperties"><props>可以利用 hibernate tools 生成相關映射文件已經(jīng) po 對象、 dao 對象, dao 也可 以自己手動編寫,無非就是實現(xiàn)
2、 crud ,如果通過繼承 hibernate 提供的 HibernateDaoSupport, 則可以更輕松的實現(xiàn) 關鍵就在于配置文件,下面看一個樣例 app.xml :<?xml version="1.0" encoding="utf-8"?> <beans xmlns=" "xmlns:xsi=" " xsi:schemaLocation=" "><!-配置數(shù)據(jù)源 -> <bean id="dataSource"class=&q
3、uot;com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><!- 指定連接數(shù)據(jù)庫的驅動 -> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!- 指定連接數(shù)據(jù)庫的 URL -> <property name="jdbcUrl" value="jdbc:mysql:/localhost/auct
4、ion"/> <!- 指定連接數(shù)據(jù)庫的用戶名 -><!- 指定連接數(shù)據(jù)庫的密碼 -><property name="password" value="root"/> <!- 指定連接數(shù)據(jù)庫連接池的最大連接數(shù) -> <property name="maxPoolSize" value="20"/> <!- 指定連接數(shù)據(jù)庫連接池的最小連接數(shù) -> <property name="minPoolSize" v
5、alue="1"/> <!- 指定連接數(shù)據(jù)庫連接池的初始化連接數(shù) -> <property name="initialPoolSize" value="1"/> <!- 指定連接數(shù)據(jù)庫連接池的連接的最大空閑時間 -> <property name="maxIdleTime" value="20"/></bean><!-配置數(shù)據(jù)庫會話工廠 -><bean id="sessionFactory"c
6、lass="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/> <property name="mappingResources"><list><value>com/ouya/User.hbm.xml</value></list><propkey="hiberna
7、te.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.cglib.use_reflection_optimizer">true</prop></props></property></bean><!-配置事務管理器 -> <bean id="t
8、ransactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><reflocal="sessionFactory"/></property> </bean><!- 配置 Spring 事務管理器代理 -> <bean id="transactionProxyFacto
9、ry" abstract="true" lazy-init="true"class="erceptor.TransactionProxyFactoryB ean"><property name="transactionManager"><ref local="transactionManager"/><prop key="save*">PROPAGATIO
10、N_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop> <p
11、ropkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop>
12、<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><!- Hibernate 模板 -> &l
13、t;bean id="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory"><ref local="sessionFactory" /></property> </bean><!- 服務層對象 -><bean id="us" class="com.o
14、uya.UserService"><property name="userDao"><ref local="userDao"/></property></bean><!- spring 代理用戶服務對象 -> <bean id="userService" parent="transactionProxyFactory"><!- 如果上面的服務層對象實現(xiàn)了接口,則此處必須設置proxyTargetClass 為true ,否
15、則會報 classcast 異常 -> <!-<property name="proxyTargetClass" value="true"/>-><property name="target" ref="us"/></bean><!- 用戶數(shù)據(jù)訪問對象 DATA ACCESS OBJECT -> <bean id="userDao" class="com.ouya.UserDAO"></bea
16、n></beans>可以看到配置文件的步驟:<property name="hibernateTemplate" ref="hibernateTemplate"/>2、1、 配置數(shù)據(jù)源配置會話工廠(依賴注入上面的數(shù)據(jù)源,還要注入hbm 映射文件 注意正確的位置 、hibernate 屬性文件)3、配置事務管理器(依賴注入上面的會話工廠)<property name="transactionManager">4、 Spring 中聲明事務管理器(根據(jù)需要又可分為幾種,但都要依賴注入上面 的事務管
17、理器,此外還需要配置 transationAttributes ) 后面的一些普通的 bean 配置就不用說了上面的例子中使用的聲明事務管理器是: TransactionProxyFactoryBean, 這樣的 話我們就需要在后面配置目標 bean,比如上面的例子中我們的原服務對象是id為 us 的 UserService (沒有實現(xiàn)接口) ,所以我們?yōu)樗渲昧?id 為 userService 的代理對象(目標bean),程序中使用時只能通過使用代理對象才能實現(xiàn)數(shù)據(jù) 庫操作功能(代理對象的父類是上面聲明的事務管理器, 一邊我們使用的時候開 啟事務),如果直接使用服務對象就無法開啟事務 程序
18、中調用: UserService us = (UserService) app.getBean("userService");注:userService就是上面配置的代理對象的id,而不是原服務對象的id但是如果我們想通過原服務對象的 id 來使用對象,則我們需要使用代理事務管 理器 BeanNameAutoProxyCreator (根據(jù) beanname 自動代理),上面的配置 文件需要做改動,做兩件事(當然先要刪除原來配置的TransactionProxyFactoryBean ,不然就混亂了,可能會報錯的):1、增加一個事務攔截器<bean id="
19、transactionInterceptor"class="erceptor.TransactionInterceptor"><ref local="transactionManager"/></property><property name="transactionAttributes"><props><prop key="save*">PROPAGATION_REQU
20、IRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop> <propkey
21、="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><pr
22、op key="list*">PROPAGATION_REQUIRED,readOnly</prop> <propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></bean>2、定義自動代理事務管理器</property><!- 定義 BeanNameAut
23、oProxyCreator-><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyC reator"><!- 如果服務層對象是接口實現(xiàn)類, 則需要設置 proxyTargetClass 屬性為 true-> <!-<property name="proxyTargetClass" value="true"-><!- 指定對滿足哪些 bean name 的 bean 自動生成業(yè)務代理 -&g
24、t; <property name="beanNames"><!- 下面是所有需要自動創(chuàng)建事務代理的 bean-><list><value>us</value></list> <!- 此處可增加其他需要自動創(chuàng)建事務代理的 bean-></property> <!- 下面定義 BeanNameAutoProxyCreator 所需的事務攔截器 -> <property name="interceptorNames"><list>
25、;<!- 此處可增加其他新的 Interceptor -><value>transactionInterceptor</value></list></bean></property>然后我們在程序中調用時應如下:UserService us = (UserService) app.getBean("us");注:注意與上面使用 TransactionProxyFactoryBean 時的調用區(qū)別, 此處我們用 getbean 時直接取原服務層對象的 id ,不需要去配置目標 bea, 這也正是BeanN
26、ameAutoProxyCreator( 根據(jù) bean 名稱自動代理 )的含義所在附錄:1、關于 hibernate 的屬性詳解:<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"> <!- 以下配置都是使用 perties 屬性文件中的配置,而之所以可以這樣 寫,就是因為有 屬性占位符配置的原因 -> <property name="drive
27、rClass" value="$jdbc.driverClassName"/> <property name="jdbcUrl" value="$jdbc.url"/> <property name="user" value="$jdbc.username"/> <property name="password" value="$jdbc.password"/><!- 連接池維持的最大的連接個數(shù) -
28、><property name="maxPoolSize" value="20"/> <!- 最大空閑時間 , 當某個連接在這個時間內(nèi)沒活動后將從池中移除, 前提是池 中至少多于最少的連接數(shù) : minPoolSize -> <property name="maxIdleTime" value="1800"/> <!- 為加強準備語句的執(zhí)行性能,此參數(shù)指定被緩存的 PreparedStatement 的 個數(shù) -> <property name="
29、;maxStatements" value="50"/> </bean>Hibernate 會話廠 SessionFactorySession 就是用于每次與數(shù)據(jù)庫會話的,因此需要: 數(shù)據(jù)庫的配置參數(shù),這些參數(shù)就是 上面的數(shù)據(jù)源指定的 ! 因此我們只需引用即 可: ref="dataSource" ; 實體映射配置 hibernate.cfg.xml 配置 結果緩存配置 (這里使用的是開源的 ehcache)<!- Hibernate SessionFactory -> <bean id="sess
30、ionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!- 引用前面定義的數(shù)據(jù)源 -><property name="dataSource" ref="dataSource"/><!- 所有實體映射文件列表 , 所有的 hbm.xml 文件 -><property name="mappingResources"><list> <v
31、alue>org/springframework/samples/jpetstore/domain/Account.hbm.xml</val ue> <value>org/springframework/samples/jpetstore/domain/Banner.hbm.xml</valu e> <value>org/springframework/samples/jpetstore/domain/Category.hbm.xml</v alue> <value>org/springframework/sampl
32、es/jpetstore/domain/Inventory.hbm.xml</v alue> <value>org/springframework/samples/jpetstore/domain/Item.hbm.xml</value> <value>org/springframework/samples/jpetstore/domain/LineItem.hbm.xml</va lue> <value>org/springframework/samples/jpetstore/domain/Order.hbm.xml&
33、lt;/value> <value>org/springframework/samples/jpetstore/domain/Product.hbm.xml</val ue> <value>org/springframework/samples/jpetstore/domain/Supplier.hbm.xml</val ue> </list> </property> <!- 傳統(tǒng)上的 hibernate.cfg.xml 文件的參數(shù)放在這里 -> <property name="hiber
34、nateProperties"> <props><prop key="hibernate.dialect">$hibernate.dialect<!- 指定數(shù)據(jù)庫方言 -></prop><!- 是否在日志中輸出所有 Hibernate 與數(shù)據(jù)庫交互的SQL 語句 -><prop key="hibernate.show_sql">true</prop><!- 是否在日志中輸出的 SQL 語句格式化成易讀形式-><prop key="
35、;hibernate.format_sql">true</prop><!- 是否顯示統(tǒng)計形式,一般在測試階段使用-><prop key="hibernate.generate_statistics">true</prop><!- 對于級聯(lián)查詢,一次性獲取的級聯(lián)深度,todo需進一步研究 -><prop key="hibernate.max_fetch_depth">2</prop><!-Fetch Size 是設定 JDBC 的 Statement
36、讀取數(shù)據(jù)的時候每次從數(shù)據(jù)庫中取出的 記錄條數(shù),一般設置為 30、50、100。Oracle 數(shù)據(jù)庫的 JDBC 驅動默認的 Fetch Size=15 ,設置 Fetch Size 設置為: 30、50,性能會有明顯提升,如果繼續(xù)增大,超出 100 ,性能提升不明顯,反而會消耗內(nèi)存。-><prop key="hibernate.jdbc.fatch_size">100</prop><!-不必等到累計到50個SQL之后才執(zhí)行.只要事務commit后,不管緩存中有多少 條 sql 語句都要執(zhí)行 .hibernate.jdbc.batch_si
37、ze 參數(shù)只是設定一次最多可以提交多少 sql 語句的上限 , 提高 sql 語句的執(zhí)行效率-><prop key="hibernate.jdbc.batch_size">50</prop> <!- (1)create 在每次 SesstionFactory 構建時 (一般是應用重啟時, 或者伴隨著應用 服務器重啟時 ),先將之前數(shù)據(jù)庫中的所有數(shù)據(jù)全部清空,后緊跟著根據(jù)所有的 hbm.xml 映射文件重新創(chuàng)建新的數(shù)據(jù)庫表(2)create-drop 除了 create 的所有含義之外,在每次應用的退出前,將進行 次數(shù)據(jù)空清空。因此這個配置
38、將有兩次清空操作, 一次是退出,一次是啟動時。(3)update如果在開發(fā)階段理發(fā)了實體對象的映射文件 (hbm.xml) 的定義后,此配置將后臺 的數(shù)據(jù)庫表進行更新 (如增加表的列 )(4)validate用于校驗現(xiàn)有的表與現(xiàn)有的配置是否一致。-> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 見下面的解釋 -> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 結果緩存配置: - 將 ehcache.xml 置于 classpath 中- 如果不設置 “查詢緩 存”, 那么 hibernate 只會緩存使用 load() 方法獲得的單個持久化對象,如果想緩存使 用 findall() 、 list() 、Iterator() 、createCriteria() 、 createQuery() 等方法獲得的數(shù)據(jù)結果集的話,就需 要設置hibern
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同范本水印去掉
- 中藥苗代銷合同范本
- 肺炎研究課題申報書
- 員工餐具采購合同范本
- 住房調換合同范本
- 煤礦研究課題申報書
- 廚房廚具采購合同范本
- 醫(yī)師勞動合同范本診所
- 南昌市商品房預售合同范本
- 合伙式經(jīng)營合同范本
- 2022年高考(全國甲卷)語文仿真模擬卷【含答案】
- 腸瘺治療PPT醫(yī)學課件(PPT 25頁)
- 員工轉正評價表
- 道路交通事故責任認定行政復議申請書范例
- 鄭州大學圖書館平立剖面效果圖
- 高效液相含量測定計算公式
- 公安機關通用告知書模板
- 《小學數(shù)學課程與教學》教學大綱
- 《手機攝影》全套課件(完整版)
- 礦井無計劃停電停風安全技術措施
- 標前合作合同協(xié)議書范本
評論
0/150
提交評論