2010-07-12 25 views
12

Tôi nhận được một ngoại lệ nói:mùa xuân 3 Chú thích - HibernateDaoSupport - Repository Yêu cầu phiên Factory

java.lang.IllegalArgumentException: 'sessionfactory' hoặc 'hibernateTemplate' được yêu cầu

Khi cố gắng sử dụng chú thích @Repository trên lớp HibernateDaoSupport. Thông báo lỗi là đơn giản, để tạo ra các Repository nó cần một sessionFactory. Tuy nhiên, tôi đã xác định một nhà máy phiên trong XML của tôi:

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

Vì vậy, tôi không chắc chắn làm thế nào để cung cấp cho các kho SessionFactory rằng nó đòi hỏi trong khi nó tạo ra nó là chú thích lái xe đậu, tôi đã cố gắng làm như sau:

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

Nhưng điều này không giải quyết được sự cố, có thể do kho lưu trữ cần thuộc tính đó trong khi khởi tạo, không chỉ khi thực hiện hành động. Thật không may, tôi không biết cách giải quyết vấn đề này bởi vì không có phương thức khởi tạo hoặc phương thức khởi tạo nào để ghi đè bằng chú thích @Autowired.

Tôi đã kiểm tra để đảm bảo rằng bean sessionFactory đang được tạo và có thể được Tự động, và điều đó là tốt.

+3

Bạn có thể không muốn sử dụng Hibernatetemplate nữa vì nó không mang lại nhiều lợi ích http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

Trả lời

36

HibernateDaoSupport được cung cấp kèm theo SessionFactory qua setSessionFactory(). Tuy nhiên, setSessionFactory()final, vì vậy bạn không thể ghi đè lên để thêm chú thích @Autowired. Nhưng bạn có thể áp dụng @Autowired với phương pháp độc đoán và gọi setSessionFactory() từ nó:

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

tuyệt vời, cảm ơn! Tôi đã bắt đầu đi xuống con đường của việc sử dụng các nhà máy trực tiếp, nhưng đã đấu tranh để mở giao dịch, tôi nghĩ rằng tôi sẽ chỉ đi với DAOSupport mặc dù, vì nó hoạt động tuyệt vời cho mục đích đơn giản của tôi. – walnutmon

+0

Đẹp, nó hoạt động khá tốt! Cảm ơn bạn đã tip @axtavt. –

6

Bạn cũng có thể xác định những phiên máy bạn muốn sử dụng (nếu bạn có nhiều hơn một, ví dụ), bằng cách sử dụng các @Qualifier chú thích :

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

Bạn cũng có thể chuyển đổi giữa các nguồn dữ liệu bằng cách mở rộng AbstractRoutingDataSource. Xem this page.

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