spring 配置文件如下:<?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:context="http://www.springframework.org/schema/context"
    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.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<context:annotation-config/>
<context:component-scan base-package="com.unmi.dao"/>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="file:src/hibernate.cfg.xml"/>
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
</beans>
PersonDaoImpl 代码声明(加了注释)如下:@Transactional
@Component("personDao")
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao{...}
客户端代码如下: BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");

PersonDao personDao = (PersonDao)beanFactory.getBean("personDao");

Person person = new Person("Unmi",23,"OK,Fu");

personDao.save(person);
执行后出现异常:
2010-04-15 13:35:43,765 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[INFO] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@667cbde6: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,personDao,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,sessionFactory,transactionManager]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personDao' defined in file [E:\workspace\TestSpring\bin\com\unmi\dao\impl\PersonDaoImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1403)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:871)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.unmi.test.Client.main(Client.java:15)
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1400)
... 12 more

请问一下,该如何解决啊,怎么才能把 SessionFactory 或 HibernateTemplate 设置给 PersonDaoImpl 呢?

解决方案 »

  1.   


    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    换成<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref bean="sessionFactory"/>
        </bean>试试~!
      

  2.   

    日了 ~!让我发一个帖子这么难吗?
     <property name="sessionFactory" ref="sessionFactory"/>
      

  3.   

    注入没写错吧,
     <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
    不推荐这么写,有时候多个空格就识别错误。
      

  4.   

    dao你有没有注入hibernateTemperature
      

  5.   

    用注解的方式,就是没找到怎么注入 sessionFactory 或者 hibernateTemplate 的。
      

  6.   

    spring 的DAO bean里也要注入一个sessionFactory
      

  7.   

    那个 DAO Bean 不需要配置在 Spring 配置文件中的,请问一下通过注解怎么向那个 PersonDaoImpl 注入一个 sessionFactory
      

  8.   

    在你继承的dao上加个
    @Autowired
    public void setSessionFactory0(SessionFactory sessionFactory){
         super.setSessionFactory(sessionFactory);
    }
    问题解决~~~~
      

  9.   

    <bean id="UserDAO" class="com.morningstar.dao.UserDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>DAO中也一样要注入sessionFactory
      

  10.   


    亲测,可以,setSessionFactory在HibernateDaoSupport中为final中不可更改,所以用这个讲sessionFactory注入进去
      

  11.   

    标准的ApplicationContext.xml配置,我相信你一看就明白,不多说:
    <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssh2" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
    </bean>
    <!-- Create SessionFactory -->
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.hbm2ddl.auto">none</prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>com/test/bean/User.hbm.xml</value>
    </list>
    </property>
    </bean> <bean id="userDao" class="com.test.UserDaoImpl.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <!-- define transcaction target --> <bean id="userServiceTarget" class="com.test.UserServiceImpl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
    </bean>

    <!-- define TransactionManager --> <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> <!--
    PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY
    支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED
    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 如果出现<prop
    key=myMethod>PROPAGATION_REQUIRED,readOnly,-Exception </prop> 其中:
    -Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交 readOnly 就是read only,
    设置操作权限为只读,一般用于查询的方法,优化作用. 事务处理需要添加:aopalliance.jar;aspectjweaver-1.5.2jar
    --> <bean id="userService"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="target" ref="userServiceTarget"></property>
    <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean> <!-- 有状态的类(包含读写属性的类),建议Scope使用prototype -->
    <bean id="saveUserAction" class="com.test.action.SaveUserAction"
    scope="prototype">
    <property name="service" ref="userService"></property>
    </bean>

    <bean id="removeUserAction" class="com.test.action.RomveUserAction"
    scope="prototype">
    <property name="service" ref="userService"></property>
    </bean>

    <bean id="listUserAction" class="com.test.action.ListUserAction"
    scope="prototype">
    <property name="service" ref="userService"></property>
    </bean>

    <bean id="updatePUserAction" class="com.test.action.UpdatePUserAction"
    scope="prototype">
    <property name="service" ref="userService"></property>
    </bean> <bean id="updateUserAction" class="com.test.action.UpdateUserAction"
    scope="prototype">
    <property name="service" ref="userService"></property>
    </bean></beans>