`
fireflylover
  • 浏览: 110501 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

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. }  

 

分享到:
评论

相关推荐

    hibernate自定义查询

    Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。在Hibernate中,自定义查询是扩展其功能的重要方式,能够帮助我们实现更复杂的数据库交互需求。本文...

    用Hibernate实现领域对象的自定义字段

    4. **配置SessionFactory**:在Hibernate配置文件(hibernate.cfg.xml)中,添加自定义类型的相关配置。 ```xml &lt;hibernate-configuration&gt; ... &lt;!-- 添加自定义类型 --&gt; ... &lt;/hibernate-configuration...

    HibernateSessionFactory.java

    HibernateSessionFactory.java

    使用 HibernateSessionFactory 类

    在Java的持久化框架Hibernate中,`SessionFactory`是核心组件之一,它负责管理数据库会话并提供对象-关系映射(ORM)的功能。本篇文章将深入探讨`SessionFactory`的使用,以及如何创建和操作它。 `SessionFactory`...

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    这篇博客"JPA + Hibernate 3 CRUD操作历史审计日志的解决方案"将深入探讨如何实现这一需求。 首先,我们需要理解JPA和Hibernate的基础概念。JPA定义了一组用于持久化Java对象的API,它允许开发者通过面向对象的方式...

    HibernateSessionFactory 代码

    本篇文章将深入探讨`HibernateSessionFactory`及其在Hibernate中的作用,以及如何使用它来实现增、删、查、改(CRUD)操作。 `SessionFactory`是Hibernate的核心组件,它是线程安全的,负责管理数据库连接和会话。`...

    spring配置sessionFactory(spring3.2.3+hibernate4.2.2)

    Spring会自动将SessionFactory注入到Repository中,无需手动创建Session。在上述代码中,`getCurrentSession()`返回了一个与当前线程绑定的Session,简化了事务管理。 此外,为了处理事务,还需要在Spring配置文件...

    很不错的Hibernate解决方案.pdf

    在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...

    HibernateSessionFactory.java Hibernate使用的整合的工具文件

    Session s= HibernateSessionFactory.getSession(); 就是Hibernate的工具java类

    HibernateSessionFactory

    用于获得Session会话及关闭Session会话

    HibernateSpring多数据库解决方案.doc

    总结一下,实现Spring与Hibernate的多数据库解决方案,主要涉及以下几个步骤: 1. 配置多个数据源,分别用于读和写操作。 2. 创建与数据源相对应的Hibernate SessionFactory,确保数据流向正确的数据库。 3. 可选地...

    Spring+Hibernate实现增删改查的两种方法

    在Java Web开发中,Spring和Hibernate是两个非常重要的框架,它们常常被联合使用来处理数据库操作,如增、删、改、查(CRUD)。本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作...

    Hibernate下数据批量处理解决方案

    然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。以下是一些关于如何在Hibernate环境下优化批量数据处理的策略。 首先,了解问题的根源。在上述例子中,当尝试向...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    标题提到的"新Hibernate SessionFactory().getCurrentSession()猫腻"揭示了一个常见的使用误区或者说是陷阱,即不正确地使用SessionFactory的getCurrentSession()方法。这篇文章可能探讨了这个方法在实际应用中的...

    hibernate实现动态表查询的多种解决方案

    ### Hibernate 实现动态表查询的多种解决方案 #### 一、前言 在使用Hibernate进行数据库操作时,我们经常需要根据不同的需求对不同的表进行查询。特别是在处理多表、多库等复杂场景时,如何实现动态表查询就显得尤...

    springboot集成hibernate

    在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...

Global site tag (gtag.js) - Google Analytics