2013-02-11 10 views
6

Tôi đang cố gắng tạo sessionFactory bean bằng cách sử dụng spring 3.2 và hibernate 4. Tôi đã sử dụng mã sau cho điều đó. Nhưng vấn đề là buildSessionFactory()không được dùng nữabuildSessionFactory(ServiceRegistry serviceRegistry) được đề xuất sử dụng thay thế trong javadoc. Tuy nhiên, tôi không thể hiểu được ServiceRegistry là gì và cách sử dụng buildSessionFactory(ServiceRegistry serviceRegistry).Định cấu hình sessionFactory với Spring, Hibernate và LocalSessionFactoryBuilder


@Configuration 
public class AppConfig { 

    ... 


    @Bean 
    public SessionFactory sessionFactory() { 
    return new LocalSessionFactoryBuilder(dataSource()) 
     .scanPackages("com.mypackages") 
     .addProperties(hibernateProperties()) 
     
          
  
    .buildSessionFactory(); 
   

    } 
} 

Trả lời

9
Giao diện

ServiceRegistry liên quan đến khái niệm dịch vụ (mới cho Hibernate 4). Dịch vụ là các lớp cung cấp Hibernate với nhiều chức năng khác nhau và người dùng có thể cắm vào các triển khai thay thế. Xem this wiki page để biết chi tiết.

Bạn đúng là phương pháp buildSessionFactory() không còn được sử dụng trong lớp học Configuration của Hibernate theo phương thức buildSessionFactory(ServiceRegistry serviceRegistry). Trong môi trường một Hibernate tinh khiết của (không có mùa xuân) nó là vụ mà bạn sẽ khởi tạo thể hiện của ServiceRegistry theo cách như vậy:

private static SessionFactory sessionFactory; 
private static ServiceRegistry serviceRegistry; 

private static SessionFactory configureSessionFactory() throws HibernateException { 
    Configuration configuration = new Configuration(); 
    configuration.configure(); 

    serviceRegistry = new ServiceRegistryBuilder() 
      .applySettings(configuration.getProperties()) 
      .buildServiceRegistry(); 

    sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    return sessionFactory; 
} 

Nhưng bây giờ các phương pháp phản buildSessionFactory() cũng thực hiện việc khởi tạo cùng ServiceRegistry cho bạn.

Mùa xuân LocalSessionFactoryBuilder lớp học chỉ là phần mở rộng của lớp học Hibernate's Configuration. Nhưng vì tất cả công việc cụ thể của Spring được thực hiện theo phương pháp overriden LocalSessionFactoryBuilder.buildSessionFactory(), bạn không thể sử dụng phương thức buildSessionFactory(ServiceRegistry serviceRegistry) trong môi trường Spring. Không có gì nhiều vì nó là ok để sử dụng buildSessionFactory() mà không chính xác cùng một công việc. Vì vậy, chúng ta hãy chỉ chú thích các phương pháp trong AppConfig với @SuppressWarnings("deprecation") và kiên nhẫn chờ đợi cho mùa xuân để cung cấp tích hợp tốt hơn với Hibernate 4.

+0

là câu trả lời này có được cập nhật không? – dtrunk

+0

@dtrunk Nếu tôi không nhầm lẫn câu trả lời vẫn còn thực tế ngay cả đối với Spring 4.0.0.RC1 –

0

Bạn cũng có thể viết mã mà không chaining:

LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource()); 
builder.scanPackages("com.mypackages"); 
builder.addProperties(hibernateProperties()); 
return builder.buildSessionFactory(); 

Hơi dài dòng hơn nhưng không phải là mùi như @SuppressWarnings ("deprecation")

0

Câu trả lời được cung cấp bởi Artem Shafranov không hoàn toàn chính xác và bạn có thể gặp phải một vấn đề rất khó hiểu như tôi đã làm.

Nếu bạn sử dụng

hibernate.hbm2ddl.auto 

ứng dụng của bạn sẽ không khởi động vì các hồ bơi kết nối trong hbm2dll sẽ được thiết lập để UserSuppliedConnectionProviderImpl (về cơ bản một cách tốt đẹp để nói: null). Bạn sẽ thấy ngoại lệ này:

org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource] 

Lý do cho việc này liên quan đến ServiceRegistry được sử dụng bởi hbm2dll nhưng không chơi tốt với Spring. Sử dụng nhiều phương pháp cấu hình phiên lập trình được đề xuất, nó sẽ không có tham chiếu đúng khi hbm2dll được thực hiện.

Cách duy nhất mà làm việc đối với tôi là như sau

@Inject 
DataSource datasource; 

@Bean 
@SuppressWarnings("deprecation") 
public SessionFactory sessionFactory() throws IOException{ 

    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
    sessionFactoryBean.setPackagesToScan("nl.your.model"); 
    sessionFactoryBean.setHibernateProperties(hibernateProperties()); 
    sessionFactoryBean.setDataSource(datasource); 
    sessionFactoryBean.afterPropertiesSet(); 

    return sessionFactoryBean.getObject(); 
} 

Sử dụng LocalSessionFactoryBuilder thất bại. Sử dụng StandardServiceRegistryBuilder, đáng ngạc nhiên, cũng thất bại.

Vấn đề thực sự khó hiểu.