2010-08-17 26 views
18

Tôi đang tìm cách tiêm một số thuộc tính thông qua Spring trong một bean được nạp từ DB bởi Hibernate.Tiêm các trường thông qua Spring vào các thực thể được tải bởi Hibernate

Ví dụ:

class Student { 
    int id; //loaded from DB 
    String name; //loaded from DB 
    int injectedProperty; //Inject via Spring 
} 

Tôi có thể định cấu hình Spring để bất cứ khi nào Hibernate tạo đối tượng của lớp Student, một số thuộc tính như được định nghĩa trong một số tệp ứng dụngContext có được tạo đối tượng không?

Trả lời

10

Có một cơ sở cho việc này, sử dụng AspectJ class weaving with the @Configurable annotation. Điều này sẽ tự động kết nối bất kỳ phiên bản new nào của một lớp được chú thích với các phụ thuộc Spring, bao gồm các đối tượng được tạo ra thông qua sự phản chiếu bằng cách sử dụng các kiểu Hibernate.

Nó yêu cầu một số phép thuật tải lớp và do đó phụ thuộc vào compatibility with your server platform.

0

Một cách là xác định loại người dùng tùy chỉnh và thuộc tính truy cập từ cấu hình mùa xuân ở đó. Nhưng tôi nghĩ bạn sẽ nhận được nhiều câu trả lời tốt hơn từ những người khác :).

29

Trong khi the aspectj way công trình, tôi muốn nói vào mùa xuân/cách ngủ đông giữa các ý kiến ​​đăng ký một LoadEventListener (đọc thêm trong hibernate core reference, các spring referencethis thread)

đây là một ảnh từ định nghĩa mùa xuân đậu sessionfactory

<bean id="mySessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    ... 
    <property name="eventListeners"> 
     <map> 
      <entry key="post-load"> 
       <bean class="com.foo.spring.MyLoadListener"></bean> 
      </entry> 
     </map> 
    </property> 
</bean> 

và đây là LoadEventListener:

public class MyLoadListener implements LoadEventListener{ 

    public void setSpringManagedProperty(String springManagedProperty){ 
     this.springManagedProperty = springManagedProperty; 
    } 
    private String springManagedProperty; 

    @Override 
    public void onLoad(LoadEvent event, LoadType loadType) throws HibernateException{ 
     if(MyEntity.class.getName().equals(event.getEntityClassName())){ 
      MyEntity entity = (MyEntity) event.getInstanceToLoad(); 
      entity.setMyCustomProperty(springManagedProperty); 
     } 

    } 

} 

Hãy nhìn mẹ, không cần thiết.

0

Bạn có thể tiêm phụ thuộc vào bean DAO ngủ đông cho thực thể và đặt thuộc tính trên thực thể trước khi trả về từ DAO.

Điều này sẽ chỉ hoạt động nếu bạn đang tải thực thể từ DAO

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