2010-04-29 47 views
23

Tôi đang cố gắng để có được Spring-defined Hibernate Configuration và SessionFactory objects trong mã không phải Spring của tôi. Sau đây là định nghĩa trong tập tin applicationContext.xml tôi:Làm thế nào tôi có thể lấy đối tượng Cấu hình Hibernate từ Mùa xuân?

Code:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 
     <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop> 
    </props> 
    </property> 
    <property name="dataSource"> 
    <ref bean="dataSource"/> 
    </property> 
    </bean> 

Nếu bây giờ tôi gọi getBean ("sessionfactory"), tôi trở lại một đối tượng $ Proxy0 đó dường như là một proxy cho đối tượng Hibernate SessionFactory. Nhưng đó không phải là thứ tôi muốn - tôi cần LocalSessionFactoryBean vì tôi cần truy cập vào Configuration cũng như SessionFactory.

Lý do tôi cần đối tượng Cấu hình là khung của chúng tôi có thể sử dụng mô hình động của Hibernate để tự động chèn ánh xạ vào thời gian chạy; điều này đòi hỏi chúng ta phải thay đổi Configuration và xây dựng lại SessionFactory. Thực sự, tất cả những gì chúng tôi đang cố gắng thực hiện là lấy cấu hình Hibernate đã tồn tại trong Spring để những khách hàng của chúng ta đã có thông tin đó trong Spring không cần sao chép nó vào một tệp hibernate.cfg.xml để sử dụng các tính năng Hibernate của chúng tôi.

+0

Và cách bạn xây dựng lại sessionFactory? Và làm thế nào để bạn đảm bảo rằng tất cả các giao dịch hiện tại đã hoàn thành trước khi gọi phá hủy? – banterCZ

Trả lời

38

Một tính năng che khuất của container mùa xuân là the & prefix:

Khi bạn cần phải hỏi một container cho một thực tế FactoryBean dụ bản thân, không phải là đậu nó tạo ra, bạn mở đầu id đậu với dấu và biểu tượng & (không có dấu ngoặc kép) khi gọi phương thức getBean của ApplicationContext. Vì vậy, đối với một trao FactoryBean với id của myBean, gọi getBean("myBean") trên chứa trả về sản phẩm của FactoryBean, và cách gọi getBean("&myBean") nhuận trường hợp FactoryBean riêng của mình.

Vì vậy, trong trường hợp của bạn, sử dụng getBean("&sessionFactory") sẽ tự động trả lại bản thân LocalSessionFactoryBean. Sau đó, bạn có thể gọi .getConfiguration() để nhận đối tượng Configuration.

+1

@skaffman Tốt lắm! –

+0

Hoàn hảo, chính xác những gì tôi cần - cảm ơn! –

+3

làm cách nào để chúng tôi có thể @Đoạn điều này? –

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