在实现持久层中工具的应用(6)

 

HIBERNATE TOOLS反向生成JAVA对象实例2

在大型的信息系统的模型设计中,表结构往往根据特定的规则,有一些有特别意义的前缀在表名和字段名中使用。 比如象下面结构中:

E-R图

 

 

前缀t1, 在实际的使用中可以代表某个模块的名称,这样相应的POJO就应该放在对应的模块中,比如这里的t1对应的是模块COMMON, 这样生成的STAFF对象就应该在mytest.hibernate.model.common包中。并且在相应的对象名不应该带有前缀T1Staff, 而应该是Staff, 字段名称也应该遵循相同的道理。

如果要达到这个目的,使用前面实例中的步骤和方法就不能实现, 所以这里需要编写一个反向工程策略的插件来完成这种特殊需求。EasyReverseEngineeringStrategy代码如下:

public class EasyReverseEngineeringStrategy extends DefaultReverseEngineeringStrategy{

    private ReverseEngineeringSettings settings = null; 

    public static Properties prop = PropertiesHelper.getProperties("reveng-strategy-config.properties");     

    public String schema,columnPrefix;

   

    public EasyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate){

       super();

       settings = new ReverseEngineeringSettings(delegate);

    }

 

    private String generateNewPkgName(String defaultPkgName,String pkgPrefix){

       if(defaultPkgName!=null && !defaultPkgName.trim().equals("")){

           if(prop!=null && prop.containsKey("DEFAULT_PKG_NAME")){

              return prop.getProperty("DEFAULT_PKG_NAME");

           }else{

              return "";

           }

       }else {

           if(prop!=null && prop.containsKey(pkgPrefix.toUpperCase())){

              return prop.getProperty(pkgPrefix.toUpperCase());

           }else{

              return defaultPkgName;

           }

       }

    }

   

    public String tableToClassName(TableIdentifier table){     

       String tableName = table.getName();

       int idx = tableName.indexOf('_');

       if(idx>=0){

           String pkgPrefix = tableName.substring(0,idx);

           System.out.println("--->pkgPrefix="+pkgPrefix);

           String pkgName = generateNewPkgName(settings.getDefaultPackageName(),pkgPrefix);

           tableName = tableName.substring(idx+1, tableName.length());

           String className = toUpperCamelCase(tableName);

           System.out.println("--->pkgName:"+pkgName);

           if (pkgName.length() > 0){

              System.out.println("--->class:"+StringHelper.qualify(pkgName, className));

              return StringHelper.qualify(pkgName, className);

           }else{

              return className;

           }

       }else{

           return super.tableToClassName(table);

       }

    }

 

    public String columnToPropertyName(TableIdentifier table, String column){

       if(prop!=null && prop.containsKey("COLUMN_PREFIX")){

           columnPrefix = prop.getProperty("COLUMN_PREFIX");

       }

       int idx = column.indexOf('_');

       if(idx>=0){

           String _prefix = column.substring(0,idx);

           if(columnPrefix!=null&&columnPrefix.indexOf(_prefix.toUpperCase())>=0){

              String cownewColName = column.substring(idx+1, column.length());

              String decapitalize = Introspector.decapitalize(toUpperCamelCase(cownewColName));

              return keywordCheck(decapitalize);

           }else{

              return super.columnToPropertyName(table, column);

           }

       }else{

           return super.columnToPropertyName(table, column);

       }

    }

   

   

 

    private String keywordCheck(String possibleKeyword){

       if (ReverseEngineeringStrategyUtil

              .isReservedJavaKeyword(possibleKeyword))

           possibleKeyword += "_";

       return possibleKeyword;

    }

 

    public void setSettings(ReverseEngineeringSettings settings){

       super.setSettings(settings);

       this.settings = settings;

    }

   

    @Override

    public boolean excludeTable(TableIdentifier ti) {

       if(prop!=null && prop.containsKey("DEFAULT_SCHEMA")){

           schema = prop.getProperty("DEFAULT_SCHEMA");

       }

       if(!ti.getSchema().equalsIgnoreCase(schema)){

           return true;

       }else{

           String tableName = ti.getName();

           int idx = tableName.indexOf('_');

           if(idx>=0){

              String pkgPrefix = tableName.substring(0,idx);

              if(prop!=null && prop.containsKey(pkgPrefix.toUpperCase())){

                  return super.excludeTable(ti);

              }else{

                  return true;

              }

           }else{

              return false;

           }

       }

    }

 

    public static void main(String[] args){

       TableIdentifier table = new TableIdentifier("t1_staff");

       EasyReverseEngineeringStrategy revEng = new EasyReverseEngineeringStrategy(null);

       String className = revEng.tableToClassName(table);

       System.out.println(className);

       System.out.println(revEng.columnToPropertyName(table, "t_ssss"));

       System.out.println(revEng.columnToPropertyName(table, "t_id"));

    }

   

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值