2013-08-02 36 views
6

Tôi đang cố di chuyển thiết lập spring3.2.x + hibernate4.x từ cấu hình xml sang java.
Heres một đoạn mã hiện: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(); 
     } 
    } 

Mùa xuân tập tin cấu hình

<!-- 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> 

này hoạt động tốt - nhưng làm thế nào để tôi tái xác định cấu hình này trong java?
Heres một nỗ lực -

@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; 
    } 

Nhưng điều này sẽ không biên dịch như sessionFacotry được gọi là không mùa xuân của LocalSessionFactoryBean?
Làm cách nào để điều chỉnh việc này?

+0

Điều này sẽ không biên dịch: lỗi biên dịch chính xác và đầy đủ là gì? Tại sao bạn không sử dụng autowiring và classpath quét thay vì xác định DAO của bạn một cách rõ ràng? –

+0

com \ data \ config \ PersistenceConfig.java: 32: setSessionFactory (org.hibernate.Sessi onFactory) trong com.data.dao.StockDaoImpl không thể được áp dụng cho (org.springframewor k.orm.hibernate4.LocalSessionFactoryBean) dao .setSessionFactory (sessionFactory()); – IUnknown

Trả lời

9

LocalSessionFactoryBean là FactoryBean<SessionFactory>. Nó có nghĩa là nó cho phép tạo ra các phiên bản của SessionFactory.

Vì vậy, bạn chỉ cần

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

Nhưng tôi sẽ không tạo DAO explicitel như thế. Đơn giản chỉ cần chú thích DAO của bạn với @Repository, và autowire nhà máy phiên sử dụng @Autowired. Đảm bảo lớp cấu hình Java được chú thích bằng @ComponentScan("the.base.package.of.daos")

0

Thiếu getObject() gọi lại.
Substituite với return sessionFactory.getObject() (và thay đổi kiểu trả về!)

Các vấn đề liên quan