接上一篇: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开发的进销存系统,还是比较经典,需求的就下载吧!
ExtJs4 进销存 数据库sqlserver2000 ssi框架
Extjs6.0+SSM+mysql进销存管理系统,包含1000+的管理系统资源文件,完成了登录、主界面、基本数据信息维护、用户管理、字典表等菜单。使用idea开发。
extjs-theme-bootstrap-master.zip
一款小型的SSH+EXTJS进销存管理系统源码
extjs2----关于extjs 的使用,操作.比较初级,但是也比较使用。适合初步接触extjs的朋友
本项目是采用easyjweb+extjs来实现,里面包括下拉数,本地下拉框,远程下拉框,treepanle and gridpanel组合开发,页面布局,如果能吃透这个项目,项目项目经验可以提高一年
源码参考,功能如下: 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 机构管理:配置系统组织机构(公司、部门、小组),树结构...进销存管理:进销存管理功能,如:采购、销售、仓库、商品、出纳、报表。
官方最新版本Extjs6.2版本sdk,创建新项目的时候需要用, 全面的核心框架,具有最新的Javascript标准支持 新的漂亮组件和主题,以创建漂亮的企业应用程序 现代工具链,用于构建优化,高性能,通用的应用程序 用于可视...
进销存php源码(extjs) extjs 仓库管理类php源码 账册管理类php源码
ExtJs + structs + spring + hibernate(进销存系统)
进销存ERP源码 一、源码描述 这是一款十分完整的进销存管理系统源码,采用了典型的三层架构技术, 该系统运用extjs+jquery+AjaxPro富客户端无刷新ajax技术,使用NPOI导出excel数据,使用 OfficeActiveX插件操作...
一个extjs的OA项目 extjs-OA extjs-oaextjs-OA extjs-oa
ext基本的控件例子ext基本的控件例子ext基本的控件例子ext基本的控件例子
extjs 培训 2011-12-17,Extjs 基础知识介绍
ExtJS 4.2 component - Field-Money
本系统采用SSH+Extjs+Sqlserver2005技术实现了面料进销存系统 Cpss进销存系统,提供基本信息管理、进货、销售、配货、财务、报表等管理功能,帮助企业处理日常的进销存业务,同时提供丰富的实时查询统计功能,对...
Ext实战项目-进销存管理系统 不错的Extjs实战项目
在 ExtJS3.3基础上开发的. 低一点的版本应该也能用. 没有去测试. 参考: Ext.PagingToolbar.js 因为我开发测试完这个分页工具后, 电脑上显示刚好是15:00, 所以取名: PM3PagingToolbar 如有BUG还请各位提出或留言. ...
extjs4.0开发人员以及学习可以下载参考