lic String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那么,其DAO层的代码如下:
package com.yumdays.service;
import org.springside.core.dao.HibernateEntityDao;
import com.yumdays.model.Catalog;
public class CatalogManager extends HibernateEntityDao<Catalog> {
}
相当的简洁,该CatalogManager类提供了非常完整的find、get、save等功能。下一步,将这个类是用Spring管理起来的时候,就必须自己指定sessionFactory了,因此,在src/resources/spring/目录下的serviceContext.xml文件中,配置的形式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-lazy-init="true" default-autowire="byName">
<bean id="catalogManager" class="com.yumdays.service.CatalogManager">
<property name="sessionFactory" ref="sessionFactoryIndex"/>
</bean>
<bean id="statisticManager" class="com.yumdays.service.StatisticManager">
<property name="sessionFactory" ref="sessionFactoryIndex"/>
</bean>
</beans>
至于事务管理器,是在配置事务的时候用到的,因此,修改src/resources/spring目录下的applicationContext.xml文件,如下:
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="true">
<!-- 注意,请把第2个*号换为项目package -->
<aop:advisor pointcut="execution(* *..service.CatalogManager.*(..))" advice-ref="txAdviceIndex"/>
<aop:advisor pointcut="execution(* *..service.StatisticManager.*(..))" advice-ref="txAdviceIndex"/>
</aop:config>
<!-- 基本事务定义,使用transactionManager作事务管理,默认get*方法的事务为readonly,其余方法按默认设置.
默认的设置请参考Spring文档事务一章. -->
<tx:advice id="txAdviceIndex" transaction-manager="transactionManagerIndex">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
OK,快速启动项目,但是还是没有成功,报出的错误提示说没有定义name为transactionManager的bean。经过我这么一改,当然没有定义这个bean了,但是我也没有用它啊?我用的是transactionManagerIndex,经过多次排查,我仍然没有找出问题的症结所在。
此外,在web.xml文件中配置的org.springframework.orm.hibernate3.support.OpenSessionInViewFilter也起不到作用了,因为我不知道这个类能不能管理多个SessionFactory,似乎是不行的。
由此可见,使用默认值的地方太多了,也是会害死人的。我已经向SpringSide的老大江南白衣请教这个问题了,暂时还没有得到回复 |