spring3.1整合hibernate4,事务都配置上了的,但getCurrentSession()仍然获得不到
以下是各配置
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<
listener
>
<
listener-class
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:applicationContext.xml</
param-value
>
</
context-param
>
<!-- Filter 定义 -->
<!-- Character Encoding filter -->
<
filter
>
<
filter-name
>encodingFilter</
filter-name
>
<
filter-class
>org.springframework.web.filter.CharacterEncodingFilter</
filter-class
>
<
init-param
>
<
param-name
>encoding</
param-name
>
<
param-value
>UTF-8</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>forceEncoding</
param-name
>
<
param-value
>true</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>encodingFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
<!-- Spring MVC Servlet -->
<
servlet
>
<
servlet-name
>springServlet</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<
init-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring-mvc.xml</
param-value
>
</
init-param
>
<
load-on-startup
>1</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>springServlet</
servlet-name
>
<
url-pattern
>/</
url-pattern
>
</
servlet-mapping
>
<!-- open session filter -->
<
filter
>
<
filter-name
>openSessionInViewFilter</
filter-name
>
<
filter-class
>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</
filter-class
>
<
init-param
>
<
param-name
>singleSession</
param-name
>
<
param-value
>true</
param-value
>
</
init-param
>
</
filter
>
<!-- session超时定义,单位为分钟 -->
<
session-config
>
<
session-timeout
>20</
session-timeout
>
</
session-config
>
<!-- Define pages of error -->
<
error-page
>
<
exception-type
>java.lang.Throwable</
exception-type
>
<
location
>/WEB-INF/error/500.jsp</
location
>
</
error-page
>
<
error-page
>
<
error-code
>500</
error-code
>
<
location
>/WEB-INF/error/500.jsp</
location
>
</
error-page
>
<
error-page
>
<
error-code
>404</
error-code
>
<
location
>/WEB-INF/error/404.jsp</
location
>
</
error-page
>
|
applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<
bean
id
=
"dataSource"
class
=
"com.jolbox.bonecp.BoneCPDataSource"
destroy-method
=
"close"
>
<
property
name
=
"driverClass"
>
<
value
>com.mysql.jdbc.Driver</
value
>
</
property
>
<
property
name
=
"jdbcUrl"
>
<
value
>jdbc:mysql://localhost:3306/pannote</
value
>
</
property
>
<
property
name
=
"username"
>
<
value
>root</
value
>
</
property
>
<
property
name
=
"password"
>
<
value
>1234</
value
>
</
property
>
<!-- Max connection numbers in every partition -->
<
property
name
=
"maxConnectionsPerPartition"
value
=
"15"
/>
<!-- Min connection numbers in every partition -->
<
property
name
=
"minConnectionsPerPartition"
value
=
"1"
/>
<!-- Partition numbers,default as 2,min as 1,recommend 3-4,depends on -->
<
property
name
=
"partitionCount"
value
=
"4"
/>
<!-- Everytime the numbers of connection requirement,default as 2 -->
<
property
name
=
"acquireIncrement"
value
=
"2"
/>
<!-- Value of the cache prepared statements,default as 0 -->
<
property
name
=
"statementsCacheSize"
value
=
"0"
/>
<!-- The number of release connection assistant process by every partition -->
<!-- Default as 3.Your performance will be affected by excessive assistant process unless you need to do a lot work in one connection -->
<
property
name
=
"releaseHelperThreads"
value
=
"3"
/>
</
bean
>
<!--Define the sessionFactory of hibernate4 -->
<
bean
id
=
"sessionFactory"
class
=
"org.springframework.orm.hibernate4.LocalSessionFactoryBean"
>
<
property
name
=
"dataSource"
>
<
ref
bean
=
"dataSource"
/>
</
property
>
<
property
name
=
"hibernateProperties"
>
<
props
>
<
prop
key
=
"hibernate.dialect"
>org.hibernate.dialect.SybaseDialect</
prop
>
<
prop
key
=
"hibernate.show_sql"
>true</
prop
>
<
prop
key
=
"hibernate.current_session_context_class"
>org.springframework.orm.hibernate4.SpringSessionContext</
prop
>
</
props
>
</
property
>
<!-- <property name="mappingResources"> <list> <value>my/hy/pannote/entity/Message.hbm.xml</value> </list> </property> -->
</
bean
>
<!-- 事务管理器配置,单数据源事务 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.orm.hibernate4.HibernateTransactionManager"
>
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
</
bean
>
<
tx:advice
id
=
"txAdvice"
transaction-manager
=
"transactionManager"
>
<
tx:attributes
>
<
tx:method
name
=
"save*"
propagation
=
"REQUIRED"
read-only
=
"false"
/>
<
tx:method
name
=
"add*"
propagation
=
"REQUIRED"
read-only
=
"false"
/>
<
tx:method
name
=
"create*"
propagation
=
"REQUIRED"
read-only
=
"false"
/>
<
tx:method
name
=
"insert*"
propagation
=
"REQUIRED"
read-only
=
"false"
/>
<
tx:method
name
=
"turn*"
propagation
=
"REQUIRED"
read-only
=
"false"
/>
<
tx:method
name
=
"*"
read-only
=
"true"
/>
</
tx:attributes
>
</
tx:advice
>
<
aop:config
proxy-target-class
=
"true"
>
<
aop:advisor
advice-ref
=
"txAdvice"
pointcut
=
"execution(* my.hy.pannote..*.*(..))"
/>
</
aop:config
>
|
spring-mvc.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
context:component-scan
base-package
=
"my.hy.pannote"
>
<
context:include-filter
type
=
"annotation"
expression
=
"org.springframework.stereotype.Controller"
/>
</
context:component-scan
>
<
mvc:annotation-driven
/>
<
mvc:default-servlet-handler
/>
<!-- 定义首页 -->
<
mvc:view-controller
path
=
"/"
view-name
=
"redirect:/index"
/>
<!-- 定义JSP -->
<
bean
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<
property
name
=
"prefix"
value
=
"/WEB-INF/views/"
/>
<
property
name
=
"suffix"
value
=
".jsp"
/>
</
bean
>
|
controller
1
2
3
4
5
6
7
8
9
10
11
|
@RequestMapping
(value =
"/addMessage"
, method = RequestMethod.POST)
public
String addMessage(Message message, RedirectAttributes redirectAttributes) {
try
{
messageService.add(message);
}
catch
(Exception e) {
e.printStackTrace();
logger.error(
"信息添加错误"
);
redirectAttributes.addFlashAttribute(
"error"
,
"系统错误,请稍后再试"
);
}
return
"redirect:/index"
;
}
|
service
1
2
3
4
5
6
7
8
9
10
11
12
|
@Component
@Transactional
public
class
MessageService {
@Autowired
private
TestDAO testDAO;
public
void
add(Message entity) {
testDAO.save(entity);
}
}
|
dao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@Component
public
class
TestDAO {
@Autowired
private
SessionFactory sessionFactory;
public
void
save(Message entity) {
System.out.println(
"-----"
+sessionFactory);
System.out.println(
"======"
+sessionFactory.getCurrentSession());
sessionFactory.getCurrentSession().saveOrUpdate(entity);
}
<div>
</div>
}<span style=
"font-size:9pt;line-height:1.5;"
> </span>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
-----org.hibernate.internal.SessionFactoryImpl
@de82eff
org.hibernate.HibernateException: No Session found
for
current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:
97
)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:
1041
)
at my.hy.pannote.dao.TestDAO.save(TestDAO.java:
18
)
at my.hy.pannote.service.MessageService.add(MessageService.java:
23
)
at my.hy.pannote.base.UserBaseController.addMessage(UserBaseController.java:
50
)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
57
)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
43
)
at java.lang.reflect.Method.invoke(Method.java:
601
)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:
213
)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:
126
)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:
96
)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:
617
)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:
578
)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:
80
)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:
923
)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:
852
)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:
882
)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:
789
)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
647
)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
728
)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
305
)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
210
)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:
88
)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:
76
)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
243
)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
210
)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
222
)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
123
)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:
502
)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
171
)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
99
)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:
953
)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
118
)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
408
)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:
1023
)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:
589
)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:
1852
)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1145
)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
615
)
at java.lang.Thread.run(Thread.java:
722
)
|
终于弄好了...原因是openSessionInViewFilter没有过滤请求
社区里也有这个问题,翻出去了才搜到...http://www.oschina.net/question/659963_87447
我修改了web.xml如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!-- open session filter -->
<
filter
>
<
filter-name
>openSessionInViewFilter</
filter-name
>
<
filter-class
>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</
filter-class
>
<
init-param
>
<
param-name
>sessionFactoryBeanName</
param-name
>
<
param-value
>sessionFactory</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>openSessionInViewFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|