如何動態生成實體類請參考這篇博文:http://www.cnblogs.com/anai/p/4269858.html
下面說說得到實體類后,如何能使用hibernate的接口來進行數據訪問。
我們都知道,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; } } }