论坛首页 Java版 Spring

不要重复设计DAO!(spring+hibernate泛型DAO)事务配置问题。

浏览 1777 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-12-20
原文链接:http://www.ibm.com/developerworks/cn/java/j-genericdao.html
这里的源文件里有个类FinderIntroductionInterceptor是implements org.springframework.aop.IntroductionInterceptor接口的,如果在applicationContext.xml配置了该bean的定义:<bean id="finderIntroductionAdvisor" class="genericdao.finder.impl.FinderIntroductionAdvisor" />,用<aop-config>声明方式配置事务就会报错。如果去掉该BEAN的定义就可以或着去掉<aop-config>也可以通过。不清楚到底是什么问题,有知道的大侠麻烦解答下,谢谢!
附件里是原文(另存为的网页)+源码(j-genericdao.zip),jar包太多不能一并上传。
   
时间:2007-12-20
这是我的配置文件 就是在源码基础上修改添加了事务控制就报错了
去掉
<aop:config>

<aop:pointcut id="serviceOperation"
expression="execution(* com.kxdsoft.pms.persistence.department.IDepartmentDAO.*(..))" />
<aop:advisor pointcut-ref="serviceOperation"
advice-ref="txAdvice" />

</aop:config>

就可以了.

或者去掉:
<bean id="finderIntroductionAdvisor"
class="genericdao.finder.impl.FinderIntroductionAdvisor" />

finderIntroductionAdvisor是实现了org.springframework.aop.IntroductionInterceptor接口的
也可以 是不是它们之间有冲突?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<bean id="namingStrategy"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="staticField">
<value>
org.hibernate.cfg.ImprovedNamingStrategy.INSTANCE
</value>
</property>
</bean>

<bean id="extendedFinderNamingStrategy"
class="genericdao.finder.impl.ExtendedFinderNamingStrategy" />

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@192.168.0.3:1521:powernet">
</property>
<property name="username" value="powernet"></property>
<property name="password" value="powernet"></property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="namingStrategy">
<ref bean="namingStrategy" />
</property>
<property name="dataSource">
<ref bean="dataSource"></ref>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9iDialect
</prop>
<prop key="show_sql">true</prop>
</props>
</property>

<property name="mappingResources">
<list>
<value>
com/persistence/department/SysDepartment.hbm.xml
</value>
</list>
</property>
</bean>



<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="get*" read-only="true" />
<tx:method name="list*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="*" />

</tx:attributes>

</tx:advice>

<aop:config>

<aop:pointcut id="serviceOperation"
expression="execution(* com.persistence.department.IDepartmentDAO.*(..))" />

<aop:advisor pointcut-ref="serviceOperation"
advice-ref="txAdvice" />

</aop:config>



<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


<!-- Dao Layer generic config-->
<bean id="finderIntroductionAdvisor"
class="genericdao.finder.impl.FinderIntroductionAdvisor" />

<bean id="abstractDaoTarget"
class="genericdao.impl.GenericDaoHibernateImpl" abstract="true">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="namingStrategy">
<ref bean="extendedFinderNamingStrategy" />
</property>
</bean>

<bean id="abstractDao"
class="org.springframework.aop.framework.ProxyFactoryBean"
abstract="true">
<property name="interceptorNames">
<list>
<value>finderIntroductionAdvisor</value>
</list>
</property>
</bean>



</beans>
   
0 请登录后投票
时间:2007-12-20
看不懂你的配置。
我直接贴核心。

<aop:config>
     <aop:advisor 
pointcut="execution(* com.orizone.hbmobile.hbcm.services.*..*ServImpl.*(..))" 
advice-ref="transactionAdvice" order="1"/>
</aop:config>

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="*" read-only="true"/>
		<tx:method name="save*"/>
		<tx:method name="merge"/>
		<tx:method name="remove*"/>
	</tx:attributes>
</tx:advice>
	
<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory">
		<ref bean="sessionFactory"/>
	</property>
</bean>


<!--genericDao-->
<bean id="genericDao"
	class="com.orizone.hbmobile.hbcm.dao.generic.impl.GenericDaoImpl">
	<property name="sessionFactory" ref="sessionFactory"/>
</bean>
	
<!--baseDao-->
<bean id="baseDao" class="com.orizone.hbmobile.hbcm.dao.impl.BaseDaoImpl"
	parent="genericDao"/>

<!-- genericServ -->
<bean id="genericServ"
	class="com.orizone.hbmobile.hbcm.services.generic.impl.GenericServImpl"
	abstract="true"/>
	
<!-- baseServ -->
<bean id="baseServ"
	class="com.orizone.hbmobile.hbcm.services.impl.BaseServImpl"
	abstract="true" parent="genericServ"/>
<!-- demoServ -->
<bean id="demoServ"
	class="com.orizone.hbmobile.hbcm.services.impl.DemoServImpl"
	parent="baseServ"/>
   
0 请登录后投票
时间:2007-12-20
不知道楼主加上事务控制以后,报的是什么样的错误啊?从配置上来看,目前看不出什么问题.把异常贴上来看一下吧.
   
0 请登录后投票
时间:2007-12-21
ecsun 写道
不知道楼主加上事务控制以后,报的是什么样的错误啊?从配置上来看,目前看不出什么问题.把异常贴上来看一下吧.

2007-12-21 16:45:33 信息 [con.out] INFO - DefaultSingletonBeanRegistry.destroySingletons(282) | Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1563e06: defining beans [namingStrategy,extendedFinderNamingStrategy,dataSource,sessionFactory,txAdvice,org.springframework.aop.config.internalAutoProxyCreator,serviceOperation,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor,transactionManager,finderIntroductionAdvisor,abstractDaoTarget,abstractDao]; root of factory hierarchy
2007-12-21 16:45:33 信息 [con.out] ERROR - ContextLoader.initWebApplicationContext(204) | Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.ClassCastException: org.springframework.beans.factory.config.FieldRetrievingFactoryBean
Caused by:
java.lang.ClassCastException: org.springframework.beans.factory.config.FieldRetrievingFactoryBean
at genericdao.finder.impl.FinderIntroductionInterceptor.invoke(FinderIntroductionInterceptor.java:17)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy7.isSingleton(Unknown Source)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1213)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:206)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:267)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1095)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:857)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:245)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:188)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
   
0 请登录后投票
时间:2007-12-21
ecsun 写道
不知道楼主加上事务控制以后,报的是什么样的错误啊?从配置上来看,目前看不出什么问题.把异常贴上来看一下吧.

反正不加<aop-config>就通过。什么错也不会报。
留下<aop-config> 去掉
<bean id="finderIntroductionAdvisor"
class="genericdao.finder.impl.FinderIntroductionAdvisor" />

也可以通过,什么错也不会报!麻烦能帮忙看一下吗?源码都在附件里。谢谢!
   
0 请登录后投票
时间:2007-12-24
晕,附件只是IBM的文章啊,很早以前看过一次.没有源码.
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐