版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、給你詳細(xì)講一下 SSH 框架的事物管理,希望對你有幫助。Struts+hibernate+spring 整合開發(fā) web 應(yīng)用是相當(dāng)流行的,只需要簡單的配置 就能輕松的對數(shù)據(jù)庫進(jìn)行 crud 操作,下面就 hibernate spring 的配置做一下剖 析,一邊與大家一起分享經(jīng)驗(yàn):1、準(zhǔn)備工作:</property><property name="hibernateProperties"><props>可以利用 hibernate tools 生成相關(guān)映射文件已經(jīng) po 對象、 dao 對象, dao 也可 以自己手動編寫,無非就是實(shí)現(xiàn)
2、 crud ,如果通過繼承 hibernate 提供的 HibernateDaoSupport, 則可以更輕松的實(shí)現(xiàn) 關(guān)鍵就在于配置文件,下面看一個(gè)樣例 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ù)庫的驅(qū)動 -> <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ù)庫連接池的連接的最大空閑時(shí)間 -> <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><!-配置事務(wù)管理器 -> <bean id="t
8、ransactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><reflocal="sessionFactory"/></property> </bean><!- 配置 Spring 事務(wù)管理器代理 -> <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><!- 服務(wù)層對象 -><bean id="us" class="com.o
14、uya.UserService"><property name="userDao"><ref local="userDao"/></property></bean><!- spring 代理用戶服務(wù)對象 -> <bean id="userService" parent="transactionProxyFactory"><!- 如果上面的服務(wù)層對象實(shí)現(xiàn)了接口,則此處必須設(shè)置proxyTargetClass 為true ,否
15、則會報(bào) 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、配置事務(wù)管理器(依賴注入上面的會話工廠)<property name="transactionManager">4、 Spring 中聲明事務(wù)管理器(根據(jù)需要又可分為幾種,但都要依賴注入上面 的事務(wù)管
17、理器,此外還需要配置 transationAttributes ) 后面的一些普通的 bean 配置就不用說了上面的例子中使用的聲明事務(wù)管理器是: TransactionProxyFactoryBean, 這樣的 話我們就需要在后面配置目標(biāo) bean,比如上面的例子中我們的原服務(wù)對象是id為 us 的 UserService (沒有實(shí)現(xiàn)接口) ,所以我們?yōu)樗渲昧?id 為 userService 的代理對象(目標(biāo)bean),程序中使用時(shí)只能通過使用代理對象才能實(shí)現(xiàn)數(shù)據(jù) 庫操作功能(代理對象的父類是上面聲明的事務(wù)管理器, 一邊我們使用的時(shí)候開 啟事務(wù)),如果直接使用服務(wù)對象就無法開啟事務(wù) 程序
18、中調(diào)用: UserService us = (UserService) app.getBean("userService");注:userService就是上面配置的代理對象的id,而不是原服務(wù)對象的id但是如果我們想通過原服務(wù)對象的 id 來使用對象,則我們需要使用代理事務(wù)管 理器 BeanNameAutoProxyCreator (根據(jù) beanname 自動代理),上面的配置 文件需要做改動,做兩件事(當(dāng)然先要刪除原來配置的TransactionProxyFactoryBean ,不然就混亂了,可能會報(bào)錯的):1、增加一個(gè)事務(wù)攔截器<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、定義自動代理事務(wù)管理器</property><!- 定義 BeanNameAut
23、oProxyCreator-><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyC reator"><!- 如果服務(wù)層對象是接口實(shí)現(xiàn)類, 則需要設(shè)置 proxyTargetClass 屬性為 true-> <!-<property name="proxyTargetClass" value="true"-><!- 指定對滿足哪些 bean name 的 bean 自動生成業(yè)務(wù)代理 -&g
24、t; <property name="beanNames"><!- 下面是所有需要自動創(chuàng)建事務(wù)代理的 bean-><list><value>us</value></list> <!- 此處可增加其他需要自動創(chuàng)建事務(wù)代理的 bean-></property> <!- 下面定義 BeanNameAutoProxyCreator 所需的事務(wù)攔截器 -> <property name="interceptorNames"><list>
25、;<!- 此處可增加其他新的 Interceptor -><value>transactionInterceptor</value></list></bean></property>然后我們在程序中調(diào)用時(shí)應(yīng)如下:UserService us = (UserService) app.getBean("us");注:注意與上面使用 TransactionProxyFactoryBean 時(shí)的調(diào)用區(qū)別, 此處我們用 getbean 時(shí)直接取原服務(wù)層對象的 id ,不需要去配置目標(biāo) bea, 這也正是BeanN
26、ameAutoProxyCreator( 根據(jù) bean 名稱自動代理 )的含義所在附錄:1、關(guān)于 hibernate 的屬性詳解:<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"> <!- 以下配置都是使用 perties 屬性文件中的配置,而之所以可以這樣 寫,就是因?yàn)橛?屬性占位符配置的原因 -> <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"/><!- 連接池維持的最大的連接個(gè)數(shù) -
28、><property name="maxPoolSize" value="20"/> <!- 最大空閑時(shí)間 , 當(dāng)某個(gè)連接在這個(gè)時(shí)間內(nèi)沒活動后將從池中移除, 前提是池 中至少多于最少的連接數(shù) : minPoolSize -> <property name="maxIdleTime" value="1800"/> <!- 為加強(qiáng)準(zhǔn)備語句的執(zhí)行性能,此參數(shù)指定被緩存的 PreparedStatement 的 個(gè)數(shù) -> <property name="
29、;maxStatements" value="50"/> </bean>Hibernate 會話廠 SessionFactorySession 就是用于每次與數(shù)據(jù)庫會話的,因此需要: 數(shù)據(jù)庫的配置參數(shù),這些參數(shù)就是 上面的數(shù)據(jù)源指定的 ! 因此我們只需引用即 可: ref="dataSource" ; 實(shí)體映射配置 hibernate.cfg.xml 配置 結(jié)果緩存配置 (這里使用的是開源的 ehcache)<!- Hibernate SessionFactory -> <bean id="sess
30、ionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!- 引用前面定義的數(shù)據(jù)源 -><property name="dataSource" ref="dataSource"/><!- 所有實(shí)體映射文件列表 , 所有的 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)計(jì)形式,一般在測試階段使用-><prop key="hibernate.generate_statistics">true</prop><!- 對于級聯(lián)查詢,一次性獲取的級聯(lián)深度,todo需進(jìn)一步研究 -><prop key="hibernate.max_fetch_depth">2</prop><!-Fetch Size 是設(shè)定 JDBC 的 Statement
36、讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫中取出的 記錄條數(shù),一般設(shè)置為 30、50、100。Oracle 數(shù)據(jù)庫的 JDBC 驅(qū)動默認(rèn)的 Fetch Size=15 ,設(shè)置 Fetch Size 設(shè)置為: 30、50,性能會有明顯提升,如果繼續(xù)增大,超出 100 ,性能提升不明顯,反而會消耗內(nèi)存。-><prop key="hibernate.jdbc.fatch_size">100</prop><!-不必等到累計(jì)到50個(gè)SQL之后才執(zhí)行.只要事務(wù)commit后,不管緩存中有多少 條 sql 語句都要執(zhí)行 .hibernate.jdbc.batch_si
37、ze 參數(shù)只是設(shè)定一次最多可以提交多少 sql 語句的上限 , 提高 sql 語句的執(zhí)行效率-><prop key="hibernate.jdbc.batch_size">50</prop> <!- (1)create 在每次 SesstionFactory 構(gòu)建時(shí) (一般是應(yīng)用重啟時(shí), 或者伴隨著應(yīng)用 服務(wù)器重啟時(shí) ),先將之前數(shù)據(jù)庫中的所有數(shù)據(jù)全部清空,后緊跟著根據(jù)所有的 hbm.xml 映射文件重新創(chuàng)建新的數(shù)據(jù)庫表(2)create-drop 除了 create 的所有含義之外,在每次應(yīng)用的退出前,將進(jìn)行 次數(shù)據(jù)空清空。因此這個(gè)配置
38、將有兩次清空操作, 一次是退出,一次是啟動時(shí)。(3)update如果在開發(fā)階段理發(fā)了實(shí)體對象的映射文件 (hbm.xml) 的定義后,此配置將后臺 的數(shù)據(jù)庫表進(jìn)行更新 (如增加表的列 )(4)validate用于校驗(yàn)現(xiàn)有的表與現(xiàn)有的配置是否一致。-> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 見下面的解釋 -> <prop key="hibernate.hbm2ddl.auto">update</prop> <!- 結(jié)果緩存配置: - 將 ehcache.xml 置于 classpath 中- 如果不設(shè)置 “查詢緩 存”, 那么 hibernate 只會緩存使用 load() 方法獲得的單個(gè)持久化對象,如果想緩存使 用 findall() 、 list() 、Iterator() 、createCriteria() 、 createQuery() 等方法獲得的數(shù)據(jù)結(jié)果集的話,就需 要設(shè)置hibern
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保護(hù)鼻子健康教案反思
- 角形的邊說課稿
- 教師職業(yè)病健康知識講座
- 展覽合同終止合同協(xié)議范例
- 市政工程保溫板施工合同
- 消費(fèi)者權(quán)益爭議解決協(xié)議
- 房屋建筑施工合同審計(jì)
- 辦公樓廁所翻新合同樣本
- 家電企業(yè)會計(jì)人員聘用協(xié)議
- 酒店窗戶安裝施工協(xié)議
- 技術(shù)合作協(xié)議技術(shù)引進(jìn)
- 2024年可行性研究報(bào)告投資估算及財(cái)務(wù)分析全套計(jì)算表格(含附表-帶只更改標(biāo)紅部分-操作簡單)
- 期中測試(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)人教版
- 公共衛(wèi)生與預(yù)防醫(yī)學(xué)繼續(xù)教育平臺“大學(xué)習(xí)”活動線上培訓(xùn)欄目題及答案
- 2024年中級經(jīng)濟(jì)師考試題庫及參考答案(綜合題)
- 小學(xué)體育課學(xué)生學(xué)情分析報(bào)告
- 2024春期國開電大《應(yīng)用寫作(漢語)》形考任務(wù)1-6參考答案
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評價(jià)細(xì)則
- 尋方問藥縱橫談智慧樹知到答案章節(jié)測試2023年浙江中醫(yī)藥大學(xué)
- JGJ_T231-2021建筑施工承插型盤扣式鋼管腳手架安全技術(shù)標(biāo)準(zhǔn)(高清-最新版)
- epdm施工方案(完整版)
評論
0/150
提交評論