TA的每日心情 衰 2021-2-2 11:21
签到天数: 36 天
[LV.5]常住居民I
struts +hibernate +spring 整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:
' Z8 h; B$ b9 s: Y* d
$ [ e5 _/ |: S# @4 p6 Z 1、 准备工作:
' c, `. j; i! u3 n/ s 1 s, j$ I4 |% z9 H3 i/ e, R
可以利用hibernate tools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现 + H$ d$ q( m7 v) [) z# V
0 H" q+ o; E* g9 o$ e K 关键就在于配置文件,下面看一个样例app.xml:
2 Q$ i3 J# H: j7 W 9 \3 u4 Q' ?, Q; R4 l0 m
<?xml version="1.0" encoding="utf-8"?>
) D, Z9 ^0 V' f( M% v( ?, ^" V8 s6 N8 e
" C4 R* {& i! ^ <beans xmlns="http://www.springframework.org/schema/beans" 3 c! m2 V z! J5 i0 R
6 V5 C& W6 Y1 Q2 ?" j
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
/ _" P2 g/ U J% ~0 B' J; x9 b
$ o* z3 t, `8 _, ^1 B xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
/ u" [. \# B$ F+ K4 z2 P S% _; c$ {
* z* J5 j" j2 z$ v <!--配置数据源--> / K6 S# E* ^$ Z! t q
3 F: }7 `" G) t ?9 Q$ v# G
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> " u4 g M: {& X0 ^
: F# \' |7 J% _. P) c
<!-- 指定连接数据库的驱动 -->
$ L9 N/ y" U& @; r% K: g( Q ; s, y5 t( l7 ^0 t) l1 n
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
+ X$ L" T9 o* ^5 q / z( N( Z( @4 M2 ?8 n2 [& B1 J
<!-- 指定连接数据库的URL -->
0 N7 |& s& ^: Z0 A. d
6 {: u2 f5 l' w- T6 b F* { a <property name="jdbcUrl" value="jdbc:mysql://localhost/auction"/>
' @( ~: X& B w
! q; F6 f" I* b) U1 z <!-- 指定连接数据库的用户名 -->
* n! M. W. k) e0 f+ [ 5 s: h/ s* I4 w
<property name="user" value="root"/>
- b J$ @( g3 N; U! z# N ) R5 a/ A/ G& D+ W
<!-- 指定连接数据库的密码 -->
' g) n z% d" b/ ]9 o. o
- h: p* h9 C% c/ [' j <property name="password" value="root"/> 3 F2 B: k5 C ^ R8 ?
6 c- J0 m. X- o: ^' \/ C Z <!-- 指定连接数据库连接池的最大连接数 -->
0 L) K/ D) n% f( t+ @ + b8 j7 j" _5 \. b4 I# r r. u
<property name="maxPoolSize" value="20"/> 2 S% e9 w# L2 [
5 o% ^9 \' f$ x <!-- 指定连接数据库连接池的最小连接数 --> % }' u) E. e' O5 z
1 V0 y3 Y5 Q5 ]6 k: [4 F8 Z <property name="minPoolSize" value="1"/>
2 g) {3 h) C( \# O) N , O5 S: |; S2 f- x
<!-- 指定连接数据库连接池的初始化连接数 --> [5 k9 n! g% O" h7 _8 P- K% e
8 \+ ^- \" p1 `' @2 s a
<property name="initialPoolSize" value="1"/>
$ {! l5 G9 |% T5 K! p4 U ' I' }/ H6 W4 e% T, n
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
0 b" D) A4 q7 A7 u: K* l * o2 g' J* _ E* f5 O9 \. M
<property name="maxIdleTime" value="20"/>
! G$ S9 A" k( b1 p+ m' q& x; K ' s: _- m$ A$ O& I& m3 |" f
</bean>
, t2 {" \* x3 G/ ~: \ f0 l5 t0 y 2 ^1 c3 [ U1 D* G8 Z# f
1 F+ v* _- K+ \9 c, d, A; T0 T
4 R3 f& x) k+ t1 ~% ?, ?; l" H <!--配置数据库会话工厂-->
6 d- d4 Z3 g K0 q
9 L* y, l* ]5 J, ^# s9 N( Z8 H8 G# q <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> - l; d7 [/ V* X7 {8 r* ^
% s8 c/ w; Q$ ^ m
<property name="dataSource" ref="dataSource"/>
, N! M8 A! O# c. A
% r. c4 {6 X8 O' H$ z2 ` <property name="mappingResources">
5 L4 N( M6 W( O$ L) |% } - T" [- H) l0 R5 c
<list>
9 J" `2 L' K! G
; I/ n4 t. o, x7 |, k' S <value>com/ouya/User.hbm.xml</value> 9 V( L0 {2 p; m5 X1 Y
0 [$ `- v2 x) H7 W </list> * K4 M7 n* [4 }! E8 [2 `
d% n. m7 q/ C' C P </property>
/ \, U3 E, i6 g
( K( U5 x. j" _. p" s/ a7 g <property name="hibernateProperties"> a& [' M! e- x, Q
$ `7 m' l0 L. |% }9 ]* y( s
<props> _6 |$ f6 I" \' z
8 ~9 U, A3 {: `7 Y* A) D/ J <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> & f- `8 v9 t( G/ p6 u: a( y! V/ ~
6 K4 U- W8 Z( U5 u5 u# g' g <prop key="hibernate.show_sql">true</prop> 9 l+ U8 o* `8 c) A& o& G
+ T% q" a: Y1 A: w- p& U9 P7 _/ S5 s0 h
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 0 H4 q2 s7 p. s$ ]" H1 D
+ f3 Z# R4 S$ ^0 J. h </props> ! O" h2 w) Y2 b( V- ?( h; A
! o. l2 c4 E0 {
</property>
$ B3 E2 r1 ?; v* T ( i6 _5 b( s5 K( Q$ _. s4 Q
</bean>
M% I' M" y/ J. N- @ ' `0 }" l+ N% J( e; F$ `3 [1 Z
& i5 P7 ?: ~' N% w
+ z6 I* B5 d0 K- F' ] <!--配置事务管理器--> ! E. r4 R. k) D# Z+ t
+ c$ D% w9 ?/ i X+ N o3 {
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> . l- h1 C; a/ z2 [: g# W
! z7 s8 `2 n9 E/ I' z
<property name="sessionFactory"><ref local="sessionFactory"/></property> 9 _1 e4 T7 d% w7 Z+ q- X/ W
/ S, ], q6 e. {+ p8 Z. g </bean> , [5 S( C8 c6 ?# C e4 {. u
7 S& P- n8 [4 b$ h9 m; c
<!—-配置Spring 事务管理器代理 --> 3 c7 K4 A" [* k/ D' W+ h
* H2 n5 C1 Y, v E
<bean id="transactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 1 A/ V" ]1 R" a
7 x" r/ p4 w' x8 O: V% n6 g
<property name="transactionManager">
7 c3 h+ Q1 ~( t. M2 Y : y# |. c+ }7 E0 l1 P
<ref local="transactionManager"/> ( Y2 h. q7 B& Z0 }
, M% r6 {, Z. D </property>
8 }7 F/ Z& i5 p. i
* {. S/ B" A' A( T/ X <property name="transactionAttributes"> : e7 v' p; D9 L
! ?" \% X. c5 q3 I1 R; M, f
<props> ; Q9 |7 M3 A2 D) H
3 ]$ e6 I0 w4 t0 C% x
<prop key="save*">PROPAGATION_REQUIRED</prop> , |2 e) w6 k1 H7 v- O9 v
# V" @! f& l0 k <prop key="insert*">PROPAGATION_REQUIRED</prop>
8 M! u k* G4 `9 e/ m% m* E 0 q' |9 G$ n: h/ ]8 m- r
<prop key="del*">PROPAGATION_REQUIRED</prop> 5 X( u2 b* I% W$ H" H: Z4 E
& q( A7 W. s+ t2 |4 S <prop key="add*">PROPAGATION_REQUIRED</prop>
" A& q2 _8 |/ ?2 a' U + \ N. V) V2 m
<prop key="update*">PROPAGATION_REQUIRED</prop> ( y) }. M" B& J: W2 u6 K
9 l. h2 \& l0 _0 N$ l <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> * m5 _6 h, h5 W$ I/ r: w6 b+ N
3 K7 _: \& K. w; L4 }2 t/ F# Y
<prop key="search*">PROPAGATION_REQUIRED,readOnly</prop> & Z. z; U# z' y/ B7 @
. ^5 c, v4 z$ M) x$ N7 N! r" p0 k
<prop key="remove*">PROPAGATION_REQUIRED,readOnly</prop> ; O" o8 x+ l2 N% L
5 T2 U$ Y0 M1 D <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
* I" i1 P/ Y$ G) P
& q* |& v3 s! O, `$ O+ l/ P, A$ D <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
* O( s9 V6 a) N+ O; `% U' e 7 b5 a* W0 N% R6 l
<prop key="count*">PROPAGATION_REQUIRED,readOnly</prop> + O' I A" ^9 K9 u3 l
$ ^+ y4 U% A) m9 K# k; e
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> $ d H9 j! F8 b/ Y1 f
4 p+ Q! x7 V/ L: E3 Y
</props> ' P/ F) k; \- v
9 w: U1 `3 b7 y </property>
|$ n1 w! x. L1 @2 s
& |0 @+ A# W/ j; P9 t5 `8 P# a </bean> - A- a4 V3 W' {
; v. f) e3 e) p5 w- c <!-- Hibernate模板 --> ) Q- ?1 Q$ O" R0 m, l* `0 Y. q
* s, U4 T2 Z% m8 E E <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> . T: v/ |7 f* e! m! D
# _- I) |7 N% Y! k <property name="sessionFactory">
* V6 w/ v2 m& S' ^; q* i # G/ g: t3 g% ~, ~4 j( U
<ref local="sessionFactory" /> ' J% q# d6 {# C% `
E6 N* ?( E1 i </property> 5 O& e3 u( T2 j& z# `3 i
5 L W: ]4 B1 _. \6 A7 h5 X8 u
</bean>
! g0 P: u0 b' B7 \
7 Y' F" c' S: N o <!--服务层对象-->
; L- x8 c+ X9 L1 v6 i1 k% t 2 j, ]- M- a8 ]3 \' d
<bean id="us" class="com.ouya.UserService"> # g' o4 f( V1 S* a8 l2 ^
* t& ]( K$ w. ?) j, `% d) o r <property name="userDao">
4 W8 H: }+ g* @) A v W( F* b: f+ P* R
<ref local="userDao"/> / {1 l, b2 H2 {* J' g2 W
' b# u; p9 r/ p. ?9 a
</property>
) T: y; J x. w3 i9 V
( O4 M( j! H& m$ A! w0 ] </bean> 2 ]1 c# W5 q3 m E" y1 Z: r+ @4 W" K
& `2 \/ s% i7 H' L8 f2 t
<!-- spring代理用户服务对象 --> 2 ]1 q8 W2 `5 q6 k, K2 ]! s8 J
) `1 O( |2 u, M3 I* G! M <bean id="userService" parent="transactionProxyFactory"> . w7 O- K( W* I- _
& X$ L$ W! n: I1 b
<!-- 如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常 --> * K! ?$ f0 a. Y- u- S1 ]; L5 J
& F# d: m# O( @: E9 ?, Y, { <!--<property name="proxyTargetClass" value="true"/>-->
! F+ N2 [9 \7 h' z5 f) R ; S3 K1 L. R% |6 H
<property name="target" ref="us"/>
8 ]) O8 h: n8 x: j D$ g& l( l, B' \$ b! \; I; O0 c/ y. x/ |
</bean> ) I! G' U7 ]- a2 b
. l7 C! Q: S+ \* f5 }
<!-- 用户数据访问对象DATA ACCESS OBJECT -->
2 b2 C7 C. l' }- W2 p
* X4 t$ a* E. _& ` <bean id="userDao" class="com.ouya.UserDAO">
8 `3 q6 C' b5 ?) ~/ X
3 ]% T5 l( y% p/ r: G <property name="hibernateTemplate" ref="hibernateTemplate"/>
2 O* Q( R1 l/ r$ T, B3 [* p) Z# }
# {, Y" G: S3 X, q# Q </bean> " ]! Q9 m# K J: o+ {% {, p, [
^) p( y+ M3 N B
</beans> 6 Z5 S$ O+ A6 a/ Y, k
; V, s' E/ k( h1 B$ Z/ ] 可以看到配置文件的步骤: ! h9 H; C/ W/ G( Z2 W5 Z2 P* K1 [. K
$ D4 K# o* o' [. i0 {( V
1、 配置数据源 / g7 S+ x& r; G" A/ h0 N9 m8 @( F
1 D+ O4 d9 ~; z/ J% u# T* O 2、 配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件) ) |2 t) O" N% o) I) m4 `
, {; j8 p1 O0 A; E3 g, U4 b2 N 3、 配置事务管理器(依赖注入上面的会话工厂)
: l! i" B, x. g8 z# m8 G8 i 9 ]( L( ^$ T1 @( F$ j
4、 Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes) j8 \6 J5 ~) {( J! H5 K# u. O5 u
9 _% u9 ^5 n# z; r, o& U 后面的一些普通的bean配置就不用说了 # Z! \# C* z0 }' ^; H7 {8 H
/ r( f2 U9 ?6 N) t; O | 上面的例子中使用的声明事务管理器是:TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务 - |8 b4 ^& p1 C( {5 j$ Y
6 n$ f+ }- H. R2 b
程序中调用:UserService us = (UserService) app.getBean("userService");
E( X( x5 x* N2 \
; x/ T! q& l5 c 注:userService就是上面配置的代理对象的id,而不是原服务对象的id % q$ R9 ~9 v4 ?4 W0 X, }9 ^* K
" y1 j/ B" J) [9 u
/ F7 c( h+ {" c( Q7 Z" s
7 y' E$ H/ d& R# P: j 但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):
/ V8 K( F7 t" a+ N$ e- f
% ~! L6 t& ^1 b8 z/ a. g' g 1、 增加一个事务拦截器 $ `% b% V$ F3 ?5 L2 R* ]+ ]
5 [, c( V7 C# b4 d$ U <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
. K) F% r2 p! }6 i 9 Y$ H! h1 A. u6 X5 n
<property name="transactionManager">
' V' U4 F0 ~9 G- Y
& P- N5 \& t n) i) ~ <ref local="transactionManager"/> 9 E- i% @; m% j6 {1 d; g0 l, G; Z1 {
* Q. c4 S Q% R) [
</property>
+ z) `1 g5 ? M& U# }8 X4 C7 I" c
$ U6 Q4 ~; p( [& _ <property name="transactionAttributes"> 6 S1 W/ R9 Z! D1 l& t2 m8 U
1 Z6 j9 v6 R! Z
<props> , ~/ f1 j+ o) u: Z2 t' ]/ a+ I
, j7 n! Q& Q8 M6 l5 H" A, {7 ]
<prop key="save*">PROPAGATION_REQUIRED</prop> o0 w0 p( u: s' s) ]8 d
! p' z' f, e: g5 P9 |) s
<prop key="insert*">PROPAGATION_REQUIRED</prop> & c- T: I+ {8 x$ `
$ k5 d k A K6 o
<prop key="del*">PROPAGATION_REQUIRED</prop>
! _$ ~6 \6 Q8 |4 ^- G8 V 4 r! s' F+ C" ]% V
<prop key="add*">PROPAGATION_REQUIRED</prop>
: O) \$ H- v; w1 o, e2 ^! X/ Q# a
9 K c+ E8 {: y: G a; L <prop key="update*">PROPAGATION_REQUIRED</prop>
3 v D9 e( `1 F * E4 k! p6 ^( B" h# Z. e
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 7 j" ^: k a5 s# ]' @3 m
! q6 M# b/ @6 t
<prop key="search*">PROPAGATION_REQUIRED,readOnly</prop> % f6 ]& Y4 N. S x% Q }: L2 g
2 t% m; B" w2 }: i/ ^9 ^ <prop key="remove*">PROPAGATION_REQUIRED,readOnly</prop>
0 I; Z* `; s! @3 g g" [
+ I( ^! v U5 O+ `- d <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
! H* q m. G, _( p
9 k& l$ s5 t+ E: V- {) M <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
% B; v) a' u" i9 N2 i' j8 x
. H2 }6 x4 Y) Z* n* ~. g( _ <prop key="count*">PROPAGATION_REQUIRED,readOnly</prop>
+ Y4 \7 v, a% [. T; U' A
& I }' e" A% d+ v5 R <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> ; z+ t- _6 c6 L/ q a* Y# p
: e D+ R$ L- |+ r) X </props>
& g/ N% `1 R% l+ q* i $ x! U; s$ s+ I/ q. ?+ O
</property> 9 r" r7 A( x, l" l4 Y$ h! S* G
. P5 Y! T# ^& }: U5 X! N* h# g
</bean> ! z7 B! [$ E* W0 K; Q% M/ Z
1 w* f, E4 G8 q7 C4 K( | l5 ` 4 \9 M4 d9 K' A# n4 {
7 `" C* m, p4 |1 q0 G( M
我的日常 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关2、本站所有主题由该帖子作者发表,该帖子作者与我的日常 享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和我的日常 的同意4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、我的日常 管理员和版主有权不事先通知发贴者而删除本文
JAVA爱好者①群:
JAVA爱好者②群:
JAVA爱好者③ :