1.hibernate 延迟加载异常:在事务外部,初次使用了延迟加载着的属性
*<class lazy="false"
<set lazy="false"
<many-to-one lazy="false"
*DAO __ Service 强制加载延迟属性(随意使用一下延迟属性)
*openSessionInView osiv spring提供了一个Filter名为:
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
1>其作用:持有SessionFactory,被此过滤器过滤的请求,会有如下的支持:
:在事务提交之后仍保持session的open的,直到当前请求的View(视图,jsp)渲染完毕,此时,
:才会将session关闭.
:此过滤器会到spring工厂中查找id为sessionFactory的bean
2>使用流程:在web.xml中配置如下的过滤器,过滤需要使用延迟属性的请求
<!-- OpenSessioInViewFilter
注意:所有过滤器必选在struts2的前端控制器之前配置
-->
<filter>
<filter-name>osiv35</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>osiv35</filter-name>
<url-pattern>/ssh35/ssh_queryUserById</url-pattern>
<url-pattern>/ssh35/ssh_queryUserByName</url-pattern>
</filter-mapping>
*此Filter中需要的SessionFactory会默认用[sessionFactory]到spring工厂中查找
*但如果工厂中的Sessionfactory没有采用此ID,则需要告知此Filter:
<filter>
<filter-name>osiv35</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory35</param-value>
</init-param>
</filter>
============================================================================================
2.基于注解的ssh整合
*@Component 作用将当前类纳入工厂
@Scope(value="prototype") 非单例创建模式
public class UserAction {
*注入
@Component
@Scope(value="prototype")
public class UserAction {
@Autowired 在工厂中寻找同类型的bean 自动注入
private UserService userService;
*事务
@Component
//作用在类中的各个方法中
@Transactional(isolation=Isolation.READ_COMMITTED,rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public class UserServiceImpl implements UserService{
....
//单独为某个方法指定事务属性
@Transactional(readOnly=true,isolation=Isolation.READ_COMMITTED,rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public void queryUserPage(Page page) throws Exception {
userDAO.queryUserPage(page);
}
}
*注意:注解使用,需要添加配置:
<!-- 注解的所在包路径 -->
<!-- <context:component-scan base-package="com.c35.action,com.c35.dao,com.c35.service"></context:component-scan>
-->
<context:component-scan base-package="com.c35"></context:component-scan>
<!-- 事务管理器 -->
<bean id="txM" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory35"></property>
</bean>
<!-- 为事务注解指定事务管理器 -->
<tx:annotation-driven transaction-manager="txM"/>
============================================================================================