【问题标题】:Spring 3 Annotations - HibernateDaoSupport - Repository Requires Session FactorySpring 3 注释 - HibernateDaoSupport - 存储库需要会话工厂
【发布时间】:2011-03-14 22:08:29
【问题描述】:

我收到一个异常说:

java.lang.IllegalArgumentException: 'sessionFactory' 或 'hibernateTemplate' 是必需的

尝试在 HibernateDaoSupport 类上使用 @Repository 注释时。错误消息很简单,为了创建存储库,它需要一个 sessionFactory。但是,我在我的 XML 中定义了一个会话工厂:

<!-- Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dashDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.mycomp.myapp.Category</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>

所以我不确定如何为存储库提供它在创建注释驱动 bean 时所需的 SessionFactory,我尝试执行以下操作:

 @Autowired
    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
        return super.createHibernateTemplate(sessionFactory);
    }

但这并不能解决问题,可能是因为存储库在实例化时需要该属性,而不仅仅是在执行操作时。不幸的是,我不知道如何解决这个问题,因为没有构造函数或初始化方法可以用 @Autowired 注释覆盖。

我检查以确保 sessionFactory bean 正在创建并且可以自动装配,这很好。

【问题讨论】:

标签: hibernate spring annotations autowired


【解决方案1】:

您还可以使用@Qualifier 注解来定义要使用的会话工厂(例如,如果您有多个):

@Autowired
public MyClassImpl(@Qualifier("myOtherSessionFactory") SessionFactory sessionFactory) {
    setSessionFactory(sessionFactory);
}

您还可以通过扩展AbstractRoutingDataSource 在数据源之间切换。见this page

【讨论】:

  • atrain@ 如果我们分离数据源,是否需要创建单独的 sessionFactories ?如果是,您能否举例说明如何在 DAO 实现(实现 HibernateDaoSupport)中使用(注入)两个不同的会话工厂
【解决方案2】:

HibernateDaoSupport 通过setSessionFactory()SessionFactory 一起提供。但是,setSessionFactory()final,因此您不能覆盖它来添加@Autowired 注释。但是您可以将@Autowired 应用于任意方法并从中调用setSessionFactory()

@Autowired
public void init(SessionFactory factory) {
    setSessionFactory(factory);
}

【讨论】:

  • 太棒了,谢谢!我已经开始直接使用会话工厂,但是在打开事务时遇到了困难,我想我还是会选择 DAOSupport,因为它非常适合我的简单用途。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2010-09-14
  • 2016-02-03
  • 2020-03-09
相关资源
最近更新 更多