2010-07-12 28 views
12

我正在一個異常說:彈簧3註解 - 的HibernateDaoSupport - 庫要求會話廠

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> 

所以我不知道如何給庫的SessionFactory的是它,而它是創造它的註釋驅動Bean需要,我試圖做到以下幾點:

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

但由於庫需要該屬性在實例,執行操作不只是當這不能解決問題,有可能。不幸的是,我不知道如何解決這個問題,因爲沒有構造函數或初始化方法可以用@Autowired註解來覆蓋。

我檢查確保sessionFactory bean正在創建,並且可以Autowired,這很好。

+3

您可能不想再使用Hibernatetemplate,因爲它不會提供太多好處http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh 2011-11-17 18:16:45

回答

36

HibernateDaoSupportSessionFactory通過setSessionFactory()提供。但是,setSessionFactory()final,因此無法覆蓋它以添加@Autowired註釋。但是你可以從它應用@Autowired到任意的方法,並調用setSessionFactory()

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

真棒,謝謝!我已經開始直接使用會話工廠的路線,但很難開放交易,但我認爲我只會使用DAOSupport,因爲它適用於我的簡單目的。 – walnutmon 2010-07-12 18:05:15

+0

不錯,它工作得很好!感謝提示@axtavt。 – 2011-04-05 01:04:42

6

你也可以定義你想使用(如果你有不止一個,例如),其會話工廠,通過使用@Qualifier註解:

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

您可以將數據源之間通過擴展AbstractRoutingDataSource也切換。見this page