欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

eclipselink 数据库表命名规则 驼峰转下划线/表名转换

程序员文章站 2023-12-23 11:18:52
...

最近公司做SAAS项目,以前用的数据源为c3p0,数据库表的命名规则为类名(驼峰)转为下划线。

比如:PersonMsg (类)  对应  表名 person_msg(表)

而现在公司用的是eclipselink做dao层操作。为了避免大量修改只能去看eclipselink是否有支持命名策略。

最后发现了终极boss《SessionCustomizer》,这个玩意。分享出来 ,以后不迷路。

public class SystemCustomizer implements SessionCustomizer {

	@Override
	public void customize(Session session) throws Exception {
		Map<Class, ClassDescriptor> descs = session.getDescriptors();
		Collection<ClassDescriptor> descriptors = descs.values();
		for (ClassDescriptor desc : descriptors) {
			String fullClassName = desc.getJavaClassName();
			String className=Helper.getShortClassName(fullClassName);
			String tableName = camelToUnderline(className);
			Vector<String> tableNames = new Vector<String>();
			tableNames.add(tableName);
			desc.setTableNames(tableNames);
			updateMappings(desc, tableName);
		}
	}
	
	private void updateMappings(ClassDescriptor desc, String tableName) {
		for (DatabaseMapping mapping : desc.getMappings()) {
			if (mapping.isDirectToFieldMapping()) {
				DirectToFieldMapping directMapping = (DirectToFieldMapping) mapping;
				directMapping.getField().setTableName(tableName);
			}
		}
	}
	/**
     * 驼峰法转下划线
     */
    public static String camelToUnderline(String line){
        if(line==null||"".equals(line)){
            return "";
        }
        line=String.valueOf(line.charAt(0)).toUpperCase().concat(line.substring(1));
        StringBuffer sb=new StringBuffer();
        Pattern pattern=Pattern.compile("[A-Z]([a-z\\d]+)?");
        Matcher matcher=pattern.matcher(line);
        while(matcher.find()){
            String word=matcher.group();
            sb.append(word.toLowerCase());
            sb.append(matcher.end()==line.length()?"":"_");
        }
        return sb.toString();
    }
}

上一篇:

下一篇: