2011-04-08 75 views
8

你可以請教我,我如何很好地爲Hibernate實體啓用Spring自動裝配?Hibernate實體自動裝配

比方說,我有一個實體,並希望有郵件發送者有:

@Entity 
public class EmailActivity extends Activity { 
    @Autowired @Transient 
    private JavaMailSender javaMailSender; 

    ... 
} 

有沒有比我的DAO做

AutowireCapableBeanFactory.autowireBean(
    getCurrentSession().get(Activity.class, id) 
); 

更好的辦法?

謝謝!

+1

將郵件發件人放入實體似乎是一個奇怪的選擇。你能更詳細地描述爲什麼你想要這種方法嗎?很顯然,由於它是標記爲瞬態的,因此不會因爲使用非貧血模式(因爲您提到了DAO)而使實例持久化。 爲什麼不將郵件發件人注入到管理員/服務層中,並使用暴露的方法傳遞相應的活動數據以通過電子郵件發送? – Jeff 2011-04-08 12:27:16

+0

相關:http://techblog.bozho.net/?p=180 – Bozho 2011-04-08 12:42:20

+0

我認爲郵件發件人是一種基礎設施。域模型不應該依賴於基礎設施代碼 – 2011-04-08 15:26:47

回答

9

這是可能的! (並且它是Spring Roo中的默認樣式!)

所有您需要的是將@Configurable註釋添加到您的實體。激活配置<context:spring-configured/>中的註釋並使用AspectJ編織。

有在春節參考一章:7.8.1 Using AspectJ to dependency inject domain objects with Spring

參見:

順便說一句,我強烈建議使用AspectJ的編譯時編織,如果可能。

2

我這樣做的方式是使用AutowiredAnnotationBeanPostProcessor。

在實體的構造函數中,您要求AutowiredAnnotationBeanPostProcessor注入「this」。

我的意見在this article末尾詳述了這項技術。本文討論了一種類似的自動裝配Hibernate實體的方法。

2

似乎有比使用aspectj編織更好的方法,即使用休眠LoadEventListener,解釋在this post