糾正一個 Hibernate 的錯誤結論

引言

以前一直覺得Hibernate獨立於SpringHibernate相關的攔截器、監聽器都不能注入Spring容器對象,最近發現這個觀點是錯誤的。java

Hibernate能夠注入Spring容器對象,只是repository的建立順序緣由,使得對象注入失敗。spring

例子

原結論

User實體:數據庫

@Entity
@EntityListeners(PasswordEncodeListener.class)
public class User {

}

實體監聽器:架構

@Component
public class PasswordEncodeListener {

    @Autowired
    private UserRepository repository;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private UserService userService;

    @Autowired
    private NoRepoService noRepoService;

    @PrePersist
    public void encode(User user) {
        System.out.println(repository);
        System.out.println(jdbcTemplate);
        System.out.println(userService);
        System.out.println(noRepoService);
    }
}

執行保存用戶的方法,打印結果:code

null
null
null
null

因此以前得出了錯誤的結論,認爲Hibernate獨立於Spring,沒法使用Spring容器內的對象。對象

依賴注入

修改監聽器,去除對倉庫的依賴,包括去除直接依賴倉庫的UserRepository與間接依賴倉庫的UserServiceit

@Component
public class PasswordEncodeListener {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private NoRepoService noRepoService;

    @PrePersist
    public void encode(User user) {
        System.out.println(jdbcTemplate);
        System.out.println(noRepoService);
    }
}

再執行保存用戶的方法,結果以下:io

org.springframework.jdbc.core.JdbcTemplate@7e9f2c32
club.yunzhi.jpa.service.NoRepoServiceImpl@3976ebfa

更新以前的錯誤觀點:class

Hibernate的監聽器、攔截器並非獨立於 Spring的,而是由於若是直接或間接依賴了倉庫,由於建立的順序問題,會致使全部對象注入失敗。若是不依賴於倉庫,對象能夠注入成功。

解決方案

因此在Hibernate內操做數據庫就有了兩種方案:容器

第一種就是咱們過去的ApplicationContextHolder,靜態方法獲取context,手動獲取倉庫對象。

第二種方案就是基於此次的新發現,能夠注入JdbcTemplate,進行數據庫的操做。

總結

雖然我總結的錯誤結論並不影響平常的使用,可是認爲仍是有必要進行糾正,你們之後都會是優秀的技術員、架構師,不但願由於個人一個錯誤結論,讓你們在之後成長的道路上遇到困難。

相關文章
相關標籤/搜索