討論一下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; } } }

 

http://www.tuicool.com/articles/Q3mEnemarkdown

相關文章
相關標籤/搜索