HIBERNATE TOOLS反向生成JAVA对象实例2
在大型的信息系统的模型设计中,表结构往往根据特定的规则,有一些有特别意义的前缀在表名和字段名中使用。 比如象下面结构中:
前缀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"));
}
}