討論一下hibernate如何動態註冊一個動態生成的實體類

  如何動態生成實體類請參考這篇博文:http://www.cnblogs.com/anai/p/4269858.htmlhtml

  下面說說獲得實體類後,如何能使用hibernate的接口來進行數據訪問。web

  咱們都知道,hibernate是在web容器啓動的時候根據相關配置信息,掃描class文件,而後註冊到SessionFactory中。經過getAllClassMetadata()能夠獲得已經註冊過的實體類的元信息。那麼若是是在容器啓動已經完成後,程序正常運行期間產生的類,顯然是不能直接使用hibernate的接口的,由於hibernate還不認識這個新建立的類呢。那麼如何在這個階段讓它們認識並創建關係呢,思路很簡單,就是註冊唄,可是這裏有個問題,咱們不能使用原來的sessionFactory了,會致使事務安全的問題,並且hibernate也建議sessionFactory一旦建立好了,就不要對其作修改,因此即便configration的內容變化了,以前就建立好的sessionFactory也不會受到影響。好了下面上代碼:數據庫

代碼中 SpringContextUtil.getBean("&sessionFactory") 的&符的含義,能夠參考這篇博文:http://www.cnblogs.com/anai/p/4258934.html安全

public class myDao{   
    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    private List<SessionFactory> sessionFactoryList = new ArrayList<SessionFactory>();

    /******************** 如下 方法只適用於對象是動態加載進JVM的狀況******************************/
    /**
     * 獲取Session工廠
     * 若是指定的model是動態加載到JVM中的,
     * 那麼就更新當前的configuration,
     * 並從新建立一個Session工廠(由於Session工廠是全局單例的,因此建立好以後最好不要改動,容易出現事務安全問題),
     * 以便能爲該對象執行數據庫訪問操做
     * 該方法若是頻繁使用,會增長系統開銷
     * @param entityClass
     * @return
     */
    private SessionFactory obtainSessionFactory(Class<?> entityClass){
        Map<String,ClassMetadata> map = sessionFactory.getAllClassMetadata();
        Set<String> set = map.keySet();
        if(!set.contains(entityClass.getName())){
            for(SessionFactory factory : sessionFactoryList){
                Set<String> existSet = factory.getAllClassMetadata().keySet();
                if(existSet.contains(entityClass.getName())){//該sessionFactory包含了此實體,就用該SessionFactory
                    return factory;
                }
            }
            LocalSessionFactoryBean localSessionFactoryBean = SpringContextUtil.getBean("&sessionFactory");
            Configuration configuration = localSessionFactoryBean.getConfiguration();
            synchronized(configuration){//避免併發操做致使configuration重複添加相同的entityClass
                if(configuration.getClassMapping(entityClass.getName())==null){
                    configuration.addAnnotatedClass(entityClass);
                }
            }
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            SessionFactory newSessionFactory = configuration.buildSessionFactory(serviceRegistry);
            sessionFactoryList.add(newSessionFactory);
            return newSessionFactory;
        }else{
            return sessionFactory;
        }
    }
}

 

相關文章
相關標籤/搜索