2013-08-02 13 views
6

Próbuję przenieść konfigurację spring3.2.x + hibernate4.x z konfiguracji xml do java.
Herezje fragment istniejącego kodu:Hibernate SessionFactory vs Spring LocalSessionFactoryBean

import org.hibernate.SessionFactory; 
import org.hibernate.Query; 
import org.hibernate.Session; 

public class StockDaoImpl implements StockDao{ 

    private SessionFactory sessionFactory; 
    public SessionFactory getSessionFactory() { 
     return sessionFactory;} 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public void save(Stock stock){ 
     Session session = getSessionFactory().openSession(); 
     try{ 
     session.save(stock); 
     } 
     finally{ 
     session.close(); 
     } 
    } 

Sprężyna config plików

<!-- Stock Data Access Object --> 
    <bean id="stockDao" class="com.data.dao.StockDaoImpl" > 
     <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 

    <bean id="dataSource"> 
..... 
</bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 

     <property name="dataSource"> 
      <ref bean="dataSource"/> 
     </property> 
     <property name="hibernateProperties"> 
      ...... 
     </property> 
     <property name="mappingResources"> 
     ....... 
     </property> 
    </bean> 

Działa to dobrze - ale jak mogę ponownie zdefiniować ten config w Java?
Herezje próbą -

@Bean 
    public StockDao stockDao() { 
     StockDaoImpl dao=new StockDaoImpl(); 
     dao.setSessionFactory(sessionFactory()); 
     return dao; 
    } 

...... 
    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(restDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { .....}); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 

     return sessionFactory; 
    } 

Ale to przyzwyczajenie skompilować jako sessionFacotry jest mowa nie jest wiosna w LocalSessionFactoryBean?
Jak mogę to pogodzić?

+0

Nie skompiluje: jaki jest dokładny i kompletny błąd kompilacji? Dlaczego nie używasz autowiring i skanowania ze ścieżkami klas zamiast jednoznacznego zdefiniowania swojego DAO? –

+0

pl \ Dane \ konfiguracji \ PersistenceConfig.java: 32: setSessionFactory (org.hibernate.Sessi onFactory) w com.data.dao.StockDaoImpl nie mogą być stosowane do (org.springframewor k.orm.hibernate4.LocalSessionFactoryBean) dao .setSessionFactory (sessionFactory()); – IUnknown

Odpowiedz

9

LocalSessionFactoryBean to FactoryBean<SessionFactory>. Oznacza to, że umożliwia tworzenie instancji SessionFactory.

więc wystarczy

public StockDao stockDao() { 
    StockDaoImpl dao=new StockDaoImpl(); 
    dao.setSessionFactory(sessionFactory().getObject()); 
    return dao; 
} 

Ale nie będę tworzyć DAOS explicitel tym stylu. Po prostu dodaj adnotację do DAO za pomocą @Repository i przeprowadź automatyczną sesję przy pomocy @Autowired. Upewnij się, że klasa konfiguracyjna Java ma przypisany komentarz @ComponentScan("the.base.package.of.daos")

0

Brakujące połączenie getObject() w zamian.
Substituite z return sessionFactory.getObject() (i zmień również typ zwrotu)!

Powiązane problemy