`
lminqiang
  • 浏览: 16199 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Extjs在线进销存-动态建表

阅读更多

  接上一篇:http://lminqiang.iteye.com/blog/1562341

进销存的单据量加上明细数据量相当庞大,如果要实现多帐套同时使用的话,那么所有的数据都放到一套表结构里面是非常恐怖的,所以每个帐套必须独享一套表结构,同时要考虑到数据量较小的实体可以共享一张表 ,比如用户表,组织结构表,仓库信息表等。

      通常的处理方式没注册一个新的帐套,那么系统自动创建一套表结构,那么带来的问题就是如何处理动态表的曾,删,改,查问题呢,而且我还不想去每次都拼sql。

        那么好,先说动态建表,为了不去拼写sql,那么最简单的方式就是使用Hibernate动态建表机制,根据映射文件,以及帐套(表)的序列号,每次动态的建表,如商品表 estore_2_goods,estore_3_goods, 每次只需要传递一个参数即可。

首先在spring配置文件中配置hibernate的namingStrategy

 

 

<bean id="sessionFactory"

		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="namingStrategy">
			<bean  class="com.webjxc.core.orm.hibernate.MyNamingStrategy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					${hibernate.dialect}
				</prop>
				<prop key="hibernate.show_sql">
					${hibernate.show_sql}
				</prop>
				<prop key="hibernate.format_sql">
					${hibernate.format_sql}
				</prop>
				<prop key="hibernate.hbm2ddl.auto">none</prop>

				<prop key="hibernate.query.substitutions">
					true 1, false 0
				</prop>

				<prop key="hibernate.cache.use_query_cache">false</prop>
				<prop key="hibernate.cache.use_second_level_cache">
					false
				</prop>
			</props>
		</property>
  

 

public class MyNamingStrategy extends DefaultNamingStrategy{

	public static final MyNamingStrategy Instance	 = new MyNamingStrategy();
	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(MyNamingStrategy.class);
	@Override
	public String classToTableName(String className) {
		String tag = com.webjxc.common.web.EsThreadVariable.getCurrentTableIndex();
		if(null == tag){
			tag = EsThreadVariable.CurrentTableIndex;
		}
		StringBuffer sb = new StringBuffer("estore_");
		sb.append(tag)
		.append("_");
		sb.append(super.classToTableName(className));
		return sb.toString();
	}
	
}

 EsThreadVariable.CurrentTableIndex 就是我们要传递进去的线程变量,用来表明是哪个帐套。

 

 

public class EsThreadVariable {

	public static final String CurrentTableIndex = "_currentTableIndex_";
	// 当前表名
	private static ThreadLocal<String> esCurrentTableIndex= new ThreadLocal<String>();
	// 当前帐套ID
	private static ThreadLocal<String> esAccinfoVariable = new ThreadLocal<String>();
 
	public static String getAccinfo(){
		return esAccinfoVariable.get();
	}
	
	public static void setAccinfo(String accinfo){
		esAccinfoVariable.set(accinfo);
	}
	
	public  static void removeAccinfo(){
		esAccinfoVariable.remove();
	}
	
	public static String getCurrentTableIndex(){
		return esCurrentTableIndex.get();
	}
	
	
	public static void setCurrentTableIndex(String s ){
		esCurrentTableIndex.set(s);
	}
	
	public static void removeCurrentTableIndex(){
		esCurrentTableIndex.remove();
	}
	
	public static String[] convertTableIndexArray(String[] array){
		String[] returnArray = new String[array.length];
		for(int i = 0 ; i < array.length ; i++){
			String str = array[i];
			returnArray[i] = str;
			if(str.indexOf(EsThreadVariable.CurrentTableIndex)!= -1)
				returnArray[i] = StringUtils.replace(str, EsThreadVariable.CurrentTableIndex, EsThreadVariable.getCurrentTableIndex());
		}
		return returnArray;
	}
	
	public static String convertTableStr(String str){
		return StringUtils.replace(str, EsThreadVariable.CurrentTableIndex, EsThreadVariable.getCurrentTableIndex());
	}
	
}

 

同时还要注意,在实体声明的时候不要指定表名:如

 

 

@Entity
public class Goods {
private String clientid;   // 供应商
	private String goodstypeid;  // 类别
	
	private String code; // 编码 
	private String barCode; // 条码
	
	private String name;
	private String shortname;
	private String specs; // 型号、款号
	private String unit;  // 商品单位
 }

 创建表的过程比较简单,要将我们需要动态创建的表在hibernate.cfg.xml文件中进行标示:如

 

 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.format_sql">true</property>
 
   	<mapping class="com.webjxc.estore.entity.needCreate.Csale" />
   	<mapping class="com.webjxc.estore.entity.needCreate.Csaledetail" />
   	<mapping class="com.webjxc.estore.entity.needCreate.Dallot" />
   	<mapping class="com.webjxc.estore.entity.needCreate.Detailbillflow" />
   	<mapping class="com.webjxc.estore.entity.needCreate.Goods" />
 
    </session-factory>

</hibernate-configuration>

 然后在你的Action中调用下面的类 ,完成动态建表。

 

 

public class TableGenerator {
	
	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(TableGenerator.class);
	/**
	 * 根据hibernate.cfg.xml 描述建表
	 * 加入了 NamingStrategy
	 * @param connection
	 * @throws SQLException 
	 */
	public void createTable(Connection connection) throws SQLException {
		log.debug("开始建表....");
		Configuration conf = new AnnotationConfiguration();
		MyNamingStrategy strategy = new MyNamingStrategy();
		conf.setNamingStrategy(strategy);
		try {
			SchemaExport dbExport = new SchemaExport(conf.configure(), connection);
			dbExport.create(false, true);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			 connection.close();
		}
	}

}
分享到:
评论

相关推荐

    SSH整合extjs开发的进销存系统

    SSH整合ExtJS开发的进销存系统是一种基于Java技术栈的Web应用程序,它结合了Spring、Struts2和Hibernate三个框架的优势,同时利用了ExtJS这个强大的JavaScript前端库,为用户提供了一个功能丰富的交互式界面。...

    ExtJs4 进销存 源代码

    这个进销存源代码示例展示了如何利用ExtJs4实现库存管理、销售管理和采购管理的核心功能,帮助开发者更好地理解和应用ExtJs4在实际项目中的实践。 进销存系统是企业管理中不可或缺的一部分,它涵盖了采购...

    Extjs6.0 进销存 ssm

    在这个"Extjs6.0 进销存 ssm"项目中,开发者利用ExtJS 6.0构建了前端界面,与SSM后端框架相结合,实现了进销存管理系统的功能。进销存系统,即采购、销售和库存管理,是企业管理中的关键部分,它帮助跟踪商品的流动...

    SSH、extjs进销存管理系统

    SSH+EXTJS结合的进销存管理系统,可以利用SSH的强大后端功能处理复杂的业务逻辑和数据处理,EXTJS的前端优势则可以提供用户友好的界面和流畅的操作体验。 在这款"SSH+EXTJS进销存管理系统"中,可能包含以下主要模块...

    extjs-theme-bootstrap-master.zip

    "extjs-theme-bootstrap-master.zip" 文件很可能是ExtJS的一个主题包,它集成了Bootstrap的样式,使得ExtJS组件能够呈现出Bootstrap的经典外观。 在深入讲解这个主题之前,让我们先了解一下基础概念: 1. **ExtJS*...

    进销存php源码(extjs)

    EXTJS则是一个强大的JavaScript库,提供了丰富的组件和布局,用于构建富客户端的用户界面,这使得进销存系统的交互性和用户体验得到显著提升。 在进销存php源码中,EXTJS通常用于构建前端界面,包括数据网格、表单...

    ExtJs + structs + spring + hibernate(进销存系统)

    在进销存系统中,ExtJs 负责创建用户友好的界面,使得操作员可以方便地进行数据输入、查询、编辑和展示,同时提供数据验证和异步通信功能,提高用户体验。 2. **Structs**: Structs 是一个基于MVC(模型-视图-...

    easyjweb+extjs 进销存系统

    本项目是采用easyjweb+extjs来实现,里面包括下拉数,本地下拉框,远程下拉框,treepanle and gridpanel组合开发,页面布局,如果能吃透这个项目,项目项目经验可以提高一年

    基于Java的进销存管理系统源码.zip

    源码参考,功能如下: 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 机构管理:配置系统组织机构(公司、部门、小组),树结构...进销存管理:进销存管理功能,如:采购、销售、仓库、商品、出纳、报表。

    Extjs 6.2 最新sdk ext-6.2.0-gpl.zip

    官方最新版本Extjs6.2版本sdk,创建新项目的时候需要用, 全面的核心框架,具有最新的Javascript标准支持 新的漂亮组件和主题,以创建漂亮的企业应用程序 现代工具链,用于构建优化,高性能,通用的应用程序 用于可视...

    Extjs6.2 生成的admin-dashboard官方模板

    Extjs6.2 生成的admin-dashboard官方模板

    进销存ERP源码下载asp.net大型制造业进销存源码 c#源代码 bs erp电子版.zip

    进销存ERP源码 一、源码描述 这是一款十分完整的进销存管理系统源码,采用了典型的三层架构技术, 该系统运用extjs+jquery+AjaxPro富客户端无刷新ajax技术,使用NPOI导出excel数据,使用 OfficeActiveX插件操作...

    extjs2----关于extjs 的使用,操作

    ExtJS 是一个强大的JavaScript库,专门用于构建富客户端Web应用程序。在标题"extjs2----关于extjs 的使用,操作"中,我们可以看出这是一份关于ExtJS 2.0版本的使用指南,主要涵盖了其基本操作和应用。描述中提到内容...

    extjs-OA extjs-oa

    一个extjs的OA项目 extjs-OA extjs-oaextjs-OA extjs-oa

    extJs例子-------

    ext基本的控件例子ext基本的控件例子ext基本的控件例子ext基本的控件例子

    extjs培训2011-12-17

    extjs 培训 2011-12-17,Extjs 基础知识介绍

    ExtJS 4.2 component - Field-Money

    ExtJS 4.2 component - Field-Money

    extjs-3.0-all-src

    这个"extjs-3.0-all-src"文件是ExtJS 3.0的完整源代码包,对于开发者来说,深入理解其内部机制和进行自定义扩展非常有价值。让我们详细探讨一下这个框架及其相关知识点。 1. **ExtJS框架概述**: ExtJS 是由Sencha...

    extjs实例--------嗖嗖嗖

    此外,参与ExtJS的社区论坛和在线资源,如Sencha官方论坛,也能帮助你找到答案和获得技术支持。 总的来说,理解并改编这个"嗖嗖嗖"项目需要深入学习ExtJS框架,熟悉其组件、布局、数据处理等方面的知识,并通过查看...

    CPSS面料进销存系统

    本系统采用SSH+Extjs+Sqlserver2005技术实现了面料进销存系统 Cpss进销存系统,提供基本信息管理、进货、销售、配货、财务、报表等管理功能,帮助企业处理日常的进销存业务,同时提供丰富的实时查询统计功能,对...

Global site tag (gtag.js) - Google Analytics