Hibernate自定义表单完全解决方案(无需重置SessionFactory) (二)

然后就是准备模板了,首先声明

Html代码 

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <hibernate-mapping>  
  5.     <class name="${entity.className}" table="${entity.tableName}">  
  6.         <#if entity.properties?exists>  
  7.             <#list entity.properties as property>  
  8.                 <#if property.primary>  
  9.                     <id name="${property.name}" type="${property.type}">  
  10.                 <#else>  
  11.                     <property name="${property.name}" type="${property.type}">  
  12.                 </#if>  
  13.                 <#if property.type=="java.lang.String">  
  14.                     <column name="${property.field?upper_case}" <#if property.length?exists>length="${property.length}"</#if>></column>  
  15.                 <#elseif property.type=="java.util.Date">  
  16.                         <column name="${property.field?upper_case}" length=7></column>  
  17.                 <#elseif property.type=="java.lang.Long" || property.type=="java.lang.Integer"  
  18.                     || property.type=="java.lang.Short">  
  19.                         <column name="${property.field?upper_case}" <#if property.length?exists>precision="${property.length}"</#if> scale="0"></column>  
  20.                 </#if>  
  21.                 <#if property.primary==true>  
  22.                     <#if property.sequence?exists>  
  23.                         <generator class="sequence">  
  24.                             <param name="sequence">${property.sequence}</param>  
  25.                         </generator>  
  26.                     </#if>  
  27.                     </id>  
  28.                 <#else>  
  29.                     </property>  
  30.                 </#if>  
  31.             </#list>  
  32.         </#if>  
  33.     </class>  
  34. </hibernate-mapping>  

 

4 注册 
首先是对生成的hbm.xml的注册,比如,我获取倒Hibernate的一个config以后 

 

 

 

 然后就是要通知sessionFactory,新增了持久类,目前很多方法都是重启sessionfactory,就是关闭当前 sessionFactory ,然后根据config build一个新的sessionFactory出来,但是,这种情况感觉总不那么完美,虽然这个过程持续不到多长时间,但用户每增一个表就close然后build一个,单说用户体验,人家正在提交数据了,你把这个给close了.... 
但目前hibernate包的 sessionFactory 确实没提供这种对持久类的add支持,XX伟人说过:没有条件 创造条件也要上,于是乎,拿起你的键盘,启动 editplus,向hibernate3的源码砍去。。

Java代码

  1. 一是,改动Configuration,三句话  
  2.     public Mapping getMapping()  
  3.     {  
  4.         return this.mapping;  
  5.     }  

 然后是SessionFactoryImpl 我们要让他知道,这个世界上还存在很多未知的来客,需要你去主动了解。。。。 
增加代码

 

  1. public void addPersistentClass(PersistentClass model,Mapping mapping)  
  2. {  
  3.     if ( !model.isInherited() ) {  
  4.         IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator(  
  5.                 settings.getDialect(),  
  6.                 settings.getDefaultCatalogName(),  
  7.                 settings.getDefaultSchemaName(),  
  8.                 (RootClass) model  
  9.         );  
  10.         if (!identifierGenerators.containsKey(model.getEntityName()))  
  11.             identifierGenerators.put( model.getEntityName(), generator );  
  12.     }  
  13.       
  14.     model.prepareTemporaryTables( mapping, settings.getDialect() );  
  15.     String cacheRegion = model.getRootClass().getCacheRegionName();  
  16.   
  17.     CacheConcurrencyStrategy cache = CacheFactory.createCache(  
  18.                 model.getCacheConcurrencyStrategy(),  
  19.                 cacheRegion,  
  20.                 model.isMutable(),  
  21.                 settings,  
  22.                 properties  
  23.             );  
  24.     if (cache!=null)  
  25.         allCacheRegions.put( cache.getRegionName(), cache.getCache() );  
  26.           
  27.       
  28.     EntityPersister cp = PersisterFactory.createClassPersister(model, cache, this, mapping);  
  29.     if ( cache != null && cache.getCache() instanceof OptimisticCache ) {  
  30.         ( ( OptimisticCache ) cache.getCache() ).setSource( cp );  
  31.     }  
  32.     entityPersisters.put( model.getEntityName(), cp );  
  33. }  

 

最后遗留的是hbm.xml在cfg.xml的注册,以保证系统重启后可以顺利加载新增的持久化配置

 

  1. /** 
  2.  * 把hbm.xml的路径加入到cfg.xml的mapping结点 
  3.  * 
  4.  * @param cfg.xml的路径 
  5.  * @param hbm.xml的路径 
  6.  */  
  7. public static void updateHbmCfg(URL url,String hbm)  
  8. {  
  9.     try  
  10.     {  
  11.         SAXReader reader = new SAXReader();  
  12.         Document doc = reader.read(url);  
  13.         Element element = (Element)doc.getRootElement()  
  14.         .selectSingleNode("session-factory");  
  15.           
  16.         Element hbmnode = element.addElement("mapping");  
  17.         hbmnode.addAttribute("resource", hbm);  
  18.         String filepath = url.getFile();  
  19.         if (filepath.charAt(0)=='/')  
  20.             filepath = filepath.substring(1);  
  21.         FileOutputStream outputstream = new FileOutputStream(filepath);  
  22.         XMLWriter writer = new XMLWriter(outputstream);  
  23.         writer.write(doc);  
  24.         outputstream.close();  
  25.     }  
  26.     catch (Exception e)  
  27.     {  
  28.         e.printStackTrace();  
  29.     }  
  30. }  

 

你可能感兴趣的:(.net,Hibernate,xml,cache)