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

HibernateSessionFactoryImpl 修改 动态添加hbm xml文件 修改了Hibernate的源码,可动态增加映射文件 立即下载

最近开发的一个系统,需要在不更改代码和重启系统的情况下提供对用户自动建表的支持,由于系统应用了hibernate,所以在建表同时也要建立持久化对象以及对这些对象注册

数据库是不确定类型的,目前在比如数据库类型支持,还有对象关系支持上都很简单,不过在现有基础上进行扩展,都是可以实现的 
实现步骤如下 
建立class->生成hbm.xml->在Hibernate'config里面注册持久化类->通知SessionFactory持久化类的新增 
1 准备 
首先准备基础数据,我建立了几个类来对生成的表和属性做描述 这些描述都将作为传输传递给class生成方法和hbm.xml的生成方法 
RenderClass 描述要生成的实体类 属性如下

  • className 类名
  • tableName 对应表名
  • properties 属性集合


RenderProperty 就是properties集合的内容 属性如下

  • name 属性名称
  • type java类型
  • field 字段名
  • primary 是否主键
  • sequence 对应ID生成的sequence
  • length 对应长度


2 生成class 
采用ASM 生成

Java代码  复制代码
  1. /**  
  2.  * 根据传入参数创建CLASS文件  
  3.  *  
  4.  * @param 类名  
  5.  * @param 保存路径  
  6.  * @param 属性描述  
  7.  * @return Class  
  8.  */  
  9. public  Class build(String clsname,String savepath,Collection properties)   
  10. {   
  11.     Class cls = null;   
  12.     try  
  13.     {   
  14.         String classname = BuildUtil.transferClassName(clsname);   
  15.         ClassWriter cw = new ClassWriter(false);      
  16.         //建立构造函数   
  17.         cw.visit(V1_1, ACC_PUBLIC, classname, null"java/lang/Object"null);      
  18.         MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>""()V"nullnull);      
  19.         mw.visitVarInsn(ALOAD, 0);      
  20.         mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object""<init>""()V");      
  21.         mw.visitInsn(RETURN);      
  22.         mw.visitMaxs(11);      
  23.         mw.visitEnd();   
  24.            
  25.         BuildProperty property = null;   
  26.         String propertytype = null;   
  27.         String propertyname = null;;   
  28.         //建立属性   
  29.         Iterator iterator = properties.iterator();   
  30.         while (iterator.hasNext())   
  31.         {   
  32.             //建立属性对应的类变量   
  33.             property = (BuildProperty)iterator.next();   
  34.             propertytype = BuildUtil.transferClassName(property.getType());   
  35.             propertyname = WordUtils.capitalize(property.getName());   
  36.             cw.visitField(ACC_PRIVATE, property.getName(), "L"+propertytype+";"nullnull).visitEnd();   
  37.             //建立get方法   
  38.             mw = cw.visitMethod(ACC_PUBLIC, "get"+propertyname, "()L"+propertytype+";"null,    
  39.             null);    
  40.             mw.visitCode();    
  41.             mw.visitVarInsn(ALOAD, 0);    
  42.             mw    
  43.             .visitFieldInsn(GETFIELD, classname, property.getName(),    
  44.             "L"+propertytype+";");    
  45.             mw.visitInsn(ARETURN);    
  46.             mw.visitMaxs(11);    
  47.             mw.visitEnd();    
  48.             //建立set方法   
  49.             mw = cw.visitMethod(ACC_PUBLIC, "set"+propertyname, "(L"+propertytype+";)V",    
  50.                     nullnull);    
  51.             mw.visitCode();    
  52.             mw.visitVarInsn(ALOAD, 0);    
  53.             mw.visitVarInsn(ALOAD, 1);    
  54.             mw    
  55.             .visitFieldInsn(PUTFIELD, classname, property.getName(),    
  56.             "L"+propertytype+";");    
  57.             mw.visitMaxs(22);    
  58.             mw.visitInsn(RETURN);    
  59.             mw.visitEnd();    
  60.         }   
  61.            
  62.         cw.visitEnd();   
  63.   
  64.         byte[] code = cw.toByteArray();    
  65.         if (savepath!=null)   
  66.         {     
  67.             Assistant.createNewFile(savepath);   
  68.             FileOutputStream fos = new FileOutputStream(savepath);      
  69.             fos.write(code);      
  70.             fos.close();      
  71.         }   
  72.         cls = this.defineClass(clsname, code, 0, code.length);   
  73.         return cls;   
  74.     }   
  75.     catch (Throwable e)   
  76.     {   
  77.         e.printStackTrace();   
  78.     }   
  79.     return cls;   
  80. }  


3 生成hbm.xml 
生成这种事情,当然是交给模板了,我这里用的是Freemarker,在这里,我要感谢freemarker的开发组,感谢webwork 感谢XXCMS系统对freemarker以及其他模板语言的大力推广,,感谢。。。。(省略100字) 
模板嘛,肯定不仅仅是应用在web环境的,看看源代码下的freemarker.cache包,恩,不错,freemarker团队确实是有一定“野心”的 首先是渲染的实现

Java代码  复制代码
  1. package com.mit.cooperate.core.asm.render;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileOutputStream;   
  5. import java.io.PrintWriter;   
  6. import java.io.StringWriter;   
  7.   
  8. import javax.servlet.ServletContext;   
  9.   
  10. import com.mit.cooperate.core.util.Assistant;   
  11.   
  12. import freemarker.cache.ClassTemplateLoader;   
  13. import freemarker.template.Configuration;   
  14. import freemarker.template.ObjectWrapper;   
  15. import freemarker.template.SimpleHash;   
  16. import freemarker.template.Template;   
  17. import freemarker.template.TemplateExceptionHandler;   
  18. /**  
  19.  * freeMarker模板渲染  
  20.  * @author courser.tijichen  
  21.  */  
  22. public class FreemarkerRender implements Render{   
  23.        
  24.     private Configuration templateconfig;   
  25.        
  26.     public  FreemarkerRender()   
  27.     {   
  28.         this.initialize();   
  29.     }   
  30.     /**  
  31.      * 初始化freemarker配置  
  32.      *  
  33.      */  
  34.     public void initialize()   
  35.     {   
  36.         try  
  37.         {   
  38.             if (templateconfig==null)   
  39.             {   
  40.                 templateconfig = new Configuration();   
  41.                 templateconfig.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);   
  42.                 templateconfig.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);   
  43.                 templateconfig.setTemplateLoader(new ClassTemplateLoader(this.getClass(),"/"));   
  44.                 templateconfig.setTemplateUpdateDelay(1200);   
  45.                 templateconfig.setDefaultEncoding("gb2312");   
  46.                 templateconfig.setLocale(new java.util.Locale("zh_CN"));   
  47.                 templateconfig.setNumberFormat("0.##########");   
  48.             }   
  49.         }   
  50.         catch (Exception e)   
  51.         {}   
  52.     }   
  53.     /**  
  54.      * 渲染  
  55.      *  
  56.      */  
  57.     public void render(RenderClass target,String template,String outpath)   
  58.     {   
  59.         try  
  60.         {   
  61.             StringWriter writer = new StringWriter();   
  62.             Template tl = templateconfig.getTemplate(   
  63.                     template,   
  64.                     templateconfig.getLocale());   
  65.             SimpleHash root = new SimpleHash();   
  66.             root.put("entity", target);   
  67.             tl.process(root, writer);   
  68.             Assistant.createNewFile(outpath);   
  69.             FileOutputStream fos = new FileOutputStream(outpath);   
  70.             PrintWriter pwriter = new PrintWriter(fos);   
  71.             pwriter.write(writer.toString());   
  72.             pwriter.close();   
  73.             fos.close();      
  74.         }   
  75.         catch (Exception ex)   
  76.         {   
  77.             ex.printStackTrace();   
  78.         }   
  79.     }   
  80. }  


然后就是准备模板了,首先声明,我这个模板写得简单粗陋之极,不过粗陋简单不正是人渣偶的终极处世之道么,何况只实现几个简单功能,仅仅是针对测试而已嘛,何必搞得那么正规严肃了,嘿嘿

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以后

Java代码  复制代码
  1. URL  url = this.getClass().getResource("/com/mit/test/person.hbm.xml");   
  2. config.addURL(url);  


然后就是要通知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 我们要让他知道,这个世界上还存在很多未知的来客,需要你去主动了解。。。。 
增加代码如下

Java代码  复制代码
  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的注册,以保证系统重启后可以顺利加载新增的持久化配置

Java代码  复制代码
  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. }  
Java代码  复制代码
  1. 大功告成 ,先运行一个小周天  


最后是总结测试,写个junit 搞定 代码如下:

Java代码  复制代码
  1. package com.mit.cooperate.core.hibernate;   
  2.   
  3. import junit.framework.TestCase;   
  4.   
  5. import java.net.URL;   
  6. import java.util.ArrayList;   
  7.   
  8. import org.apache.commons.beanutils.PropertyUtils;   
  9.   
  10. import org.hibernate.Session;   
  11. import org.hibernate.cfg.Configuration;   
  12. import org.hibernate.SessionFactory;   
  13. import org.hibernate.tool.hbm2ddl.SchemaExport;   
  14. import org.hibernate.impl.SessionFactoryImpl;   
  15. import org.hibernate.mapping.PersistentClass;   
  16. import org.hibernate.Transaction;   
  17.   
  18. import com.mit.cooperate.core.asm.*;   
  19. import com.mit.cooperate.core.asm.render.*;   
  20.   
  21. public class HibernateTest extends TestCase {   
  22.        
  23.     private Configuration config;   
  24.     private SessionFactory factory;   
  25.        
  26.     public void setUp()   
  27.     {   
  28.         URL  url = this.getClass().getResource("/com/mit/cooperate/core/hibernate/hibernate.cfg.xml");   
  29.         config = new Configuration().configure(url);   
  30.         factory = config.buildSessionFactory();   
  31.     }   
  32.        
  33.     public void testBuild() throws Exception   
  34.     {   
  35.         //持久类对象描述   
  36.         RenderClass rc = new RenderClass();   
  37.         ArrayList list = new ArrayList();   
  38.            
  39.         RenderProperty property = new RenderProperty();   
  40.         //添加主键   
  41.         property.setName("oid");   
  42.         property.setField("oid");   
  43.         property.setLength(new Integer(15));   
  44.         property.setPrimary(true);   
  45.         property.setType(Long.class.getName());   
  46.         property.setSequence("SEQ_PERSON");   
  47.            
  48.         list.add(property);   
  49.         //添加一个name字段   
  50.         property = new RenderProperty();   
  51.         property.setName("name");   
  52.         property.setType(String.class.getName());   
  53.         property.setField("name");   
  54.         property.setLength(new Integer(20));   
  55.            
  56.         list.add(property);   
  57.            
  58.         rc.setProperties(list);   
  59.         //类名   
  60.         rc.setClassName("com.mit.test.Person");   
  61.         rc.setTableName("person");   
  62.         //开始生成class   
  63.         POBuildUtil util = new POBuildUtil();   
  64.         util.build(rc.getClassName(),"E://cpc//source//cooperateCore//com//mit//test//Person.class",list);   
  65.         //实例化一个person   
  66.         Object person = Class.forName("com.mit.test.Person").newInstance();//hbmcls.newInstance();   
  67.            
  68.         //开始生成hbm.xml   
  69.         FreemarkerRender render = new FreemarkerRender();   
  70.         render.render(rc, Templates.TEMPLATE_HIBERNATE3, "E://cpc//source//cooperateCore//com//mit//test//person.hbm.xml");   
  71.         URL  url = this.getClass().getResource("/com/mit/test/person.hbm.xml");   
  72.         config.addURL(url);   
  73.         //更新hibernate.cfg.xml   
  74.         HibernateUtil.updateHbmCfg( this.getClass().getResource("/com/mit/cooperate/core/hibernate/hibernate.cfg.xml"), "com/mit/test/person.hbm.xml");   
  75.            
  76.         PersistentClass model = config.getClassMapping("com.mit.test.Person");   
  77.         //sessionFactory哪下子,快接纳person爷爷进去   
  78.         ((SessionFactoryImpl)factory).addPersistentClass(model, config.getMapping());   
  79.         //生成数据库   
  80.         SchemaExport export = new SchemaExport(config,((SessionFactoryImpl)factory).getSettings());   
  81.         export.execute(truetrue,false,true);   
  82.         //测试一下,随便给个名字什么的   
  83.         PropertyUtils.setProperty(person, "name""chenzhi");   
  84.         Session session = factory.openSession();   
  85.         Transaction tran = session.beginTransaction();   
  86.         try  
  87.         {   
  88.             //保存   
  89.             session.save(person);   
  90.             tran.commit();   
  91.         }   
  92.         catch (Exception e)   
  93.         {   
  94.             e.printStackTrace();   
  95.             tran.rollback();   
  96.         }   
  97.         finally  
  98.         {   
  99.             session.close();   
  100.         }   
  101.     }   
  102.        
  103.     public void tearDown()   
  104.     {   
  105.         factory.close();   
  106.     }   
  107.        
  108.        

一套完整自定义工作流的实现 很不错的代码,有内容说明,大家一起学习下工作流。。。 立即下载

相关推荐

No value for key [org.hibernate.impl.SessionFactoryImpl 异常解决

使用Hibernate+Spring进行CRUD操作时,出现如下类似异常信息: java.lang.IllegalStateException: No value for key [org.hibernate.impl.SessionFactoryImpl@1b912ed] bound to thread 究其原因是如果你的某段代码同一个线程中包含了不止一次的CRUD操作,在某一次的

JavaQ 1万+

Hibernate4实体映射自动生成数据库表结构

实体映射关系建立之后,不需要再花时间到数据库去建立数据表结构。可以由Hibernate直接生成后台。 Userinfo.java packageorg.kj.hibernate.bean; importjava.util.List; importjavax.persist...

chutiao7609的博客 184

iview+vue3-table 自定义表头-给表头加icon加悬浮提醒效果

iview+vue3-table 自定义表头-给表头加icon加悬浮提醒效果;renderHeader/render

程小博衍的博客 1942

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

然后就是准备模板了,首先声明 Html代码    &lt;?xml version="1.0" encoding="utf-8"?&gt;   &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   "http://hibernate.sourceforge.ne...

藏经阁 218

两个月内能狂赚10万元 售楼小姐收入大揭秘

商品房销售员可能身家百万,也可能淘汰出局,仨月没发财就走人。商品房销售员的收入曾经风光一时,令人目眩。今年东部某大盘开盘后,由于购房人蜂拥而至,曾传出有的售楼小姐在短短一两个月内狂赚10万元的消息。而实际上,售楼员的收入与楼盘单价、销量和提成比例直接挂钩,根据所售商品房是高档别墅还是二手房的差别,他们的收入也千差万别。三个月一“结账”的机制更使该行业的淘汰率达到了20%。    别墅价高求者寡不是

supervise的专栏 2300

海南售楼小姐单人一年销售13亿 提成200万

http://www.sina.com.cn   2010年02月09日 03:13   每日经济新闻 &lt;!-- 正文内容 begin --&gt; &lt;!-- google_ad_section_start --&gt; &lt;!-- 内容模块:单图 begin --&gt; &lt;!-- { 200807...

趋势创造者-一直在努力,拥抱大海,拥抱浩瀚的天空,探知未来的世界 祗偽妳動訫 Happiness keeps you Sweet 606

想买房的人必看!踢爆眼下售楼小姐的新骗局

彻底揭开当前开发商销售楼盘的操作程序,揭开骗局;揭露房价上涨的真相;2009年我们应当怎样面对购房;      开发商当前销售楼盘的操作方式,隐含严重骗局。      近日,我们针对(福州)当前房地产市场的真实情况进行了实地现场调查,掌握了第一手资料;选择了几个有代表性的楼盘进行了调查,调查结果发现,销售的手法没有大的改变,还是那种先卖不好的户型,提高销售价格,制造即将销售完毕的紧张空气,让购房者

baiuwl的专栏 2075

2万元起步 大四学生炒房资产达500万元

     一个在校大四的学生,同时也是个经验丰富的“炒家”。多年炒股、炒房的经历让他比同龄人对投资有着更多的认识。    几个月前,他刚刚用自己的积蓄买下了数套位于河北的别墅,现在,房子的价格已经涨了近四倍。  这个中国传媒大学的在校学生刚刚21岁,他的愿望是自己建立一个私募基金。  本报的意图并非渲染该学生的 “致富”门道,而是向读者展示一个大学生不同的成长经历。  起步 “

Dreamcode ~ All in AI 4466

广州淘金记:小女孩身无身文赚百万

广州淘金记:小女孩身无身文赚百万你一定听说过服装店老板在打折季节到香港“淘货”,收藏爱好者在旧货市场“淘宝”,可中原女孩杨琳在广州的创富经历却让人大开眼界——专门在拍卖行“淘房”,且在短暂时间里就赚下了百万资产。    意外发现“黄金眼”   我叫杨琳,今年26岁。1998年从郑州一家建筑学校毕业,因为找不到工作,就离开豫东老家来到广州,在一家大型房产公司当售楼小姐。    随着售楼经验的积累,...

58

眼下售楼新骗局

  彻底揭开当前开发商销售楼盘的操作程序,揭开骗局;揭露房价上涨的真相;2009年我们应当怎样面对购房;   开发商当前销售楼盘的操作方式,隐含严重骗局   近日,我们针对(福州)当前房地产市场的真实情况进行了实地现场调查,掌握了第一手资料;选择了几个有代表性的楼盘进行了调查,调查结果发现,销售的手法没有大的改变,还是那种先卖不好的户型,提高销售价格,制造即将销售完毕的紧张空气,让购房

hodrag的技術收藏 1272

海南炒房客欲撤军 10万元/平米房源5万就卖

&lt;!-- enpproperty &lt;articleid&gt;3338610&lt;/articleid&gt;&lt;date&gt;2010-02-21 08:57:16.0&lt;/date&gt;&lt;author&gt;&lt;/author&gt; &lt;title&gt;海南炒房客欲撤军 10万元/平米房源5万就卖&lt;/title&gt;

趋势创造者-一直在努力,拥抱大海,拥抱浩瀚的天空,探知未来的世界 祗偽妳動訫 Happiness keeps you Sweet 250

10大最愿意以貌取人的职业排行

  10大最愿意以貌取人的职业排行     1、机关门卫。  经典场景:一长相土气的老人来到市政府机关门卫值班室。------同志,请问王××在吗?------喂,老头,你胆子不小啊,敢直

chenwei0000的专栏 592

软件园里的流氓(8)

Normal 0 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Font Definitio

软件园里的流氓 1489

房地产年终奖丰厚,移动互联网功不可没

房地产年终奖丰厚,移动互联网功不可没 文/王易见       “2012年你拿了多少年终奖?”------这无疑是网友近期关注最多的话题,由于行业、企业、职位不同,大家拿到的年终奖差别必定会很大,那么究竟哪些行业在蛇年春节“笑得最欢”呢?       据统计,银行、电信等行业一直是国家的“朝阳产业”,年终奖相对较高,普通员工几万,高管十几万是家常便饭。不过,相比之下,房地产行业的年终奖可

feitianhanxue的专栏 2157

海南楼市井喷三个月后转向有价无市

  黄树辉   元宵节,三亚湾畔显现的有些落寞。在这里,除了三亚本地楼盘项目销售中心之外,更多的是聚集着来自琼海、五指山、文昌、保亭等地的楼盘售楼处,但都显得很冷清,一些店面甚至还关着门。   突然变化的不仅仅是市场温度,还包括官方对楼市的态度。仅在三个月之内,海南楼市从急剧井喷转向有价无市,官方表态也从此前的无泡沫转向泡沫说 ,海南房地产市场的未来走势变得更加诡异。   官方改口“地产泡...

趋势创造者-一直在努力,拥抱大海,拥抱浩瀚的天空,探知未来的世界 祗偽妳動訫 Happiness keeps you Sweet 211

北京:楼盘内部认购禁而不止 业内揭秘花招多

核心提示     楼盘内部认购禁而不止     春节刚过,京城的不少新楼盘已开始打出名目繁多的内部认购招牌。虽然建设部规定,各种形式的楼盘内部认购都属违规,但记者近日暗访发现,这仍是地产界公认的行规。内部认购原指开发商对旧业主或者公司员工进行提前认购的形式,

陈东海 1275
上一篇: oracle 检查被锁的表及解锁
下一篇: log4net使用
fangaoxin
博客等级 码龄22年 985粉丝 238原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值