天天看点

[Java web]-- spring3(6)

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"/>
 ============================================================================================