由于当前项目采用了分表策略,故一个实体会对应多个相同结构的表。只是映射的表名不一样而已~项目又使用憨包儿呢特,让我采用原生SQL总感觉不是那么爽,咋办呢?!第一念头就是如果能够动态映射就好啦,也就是现在想查table1只需将实体对应的table映射为table1即可。咋个实现动态映射呢?!也就是需要动态改变类的注解。又咋个能够动态改变类的注解呢?!本质上修改字节码,重新加载类即可,也就是所谓的字节码增强功能~ 看都看不懂字节码咋个修改呢?!还是需要站在巨人的肩上才行。ASM以及JDK自带的字节码增强都不用,马上想到CGlib,javassist。。。还是痛苦的折腾了良久,为了大家不走我的弯路~ 直接上代码先~
public class ClassPoolUtils {
/**
* 动态ORM映射
*
* @param entityClassName 待映射的实体全限定类名
* @param tableName 待映射的表名
* @return 映射后的类对象
*/
public static Class<?> tableMapping(String entityClassName, String tableName){
Class<?> c = null;
try {
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath(new ClassClassPath(ClassPoolUtils.class));
classPool.importPackage("javax.persistence");
CtClass clazz = classPool.get(entityClassName);
ClassFile classFile = clazz.getClassFile();
System.out.println("增强前Entity01:" + clazz.getAnnotation(Entity.class));
System.out.println("增强前Table02:" + clazz.getAnnotation(Table.class));
ConstPool constPool = classFile.getConstPool();
Annotation tableAnnotation = new Annotation("javax.persistence.Table", constPool);
tableAnnotation.addMemberValue("name", new StringMemberValue(tableName, constPool));
// 获取运行时注解属性
AnnotationsAttribute attribute = (AnnotationsAttribute)classFile.getAttribute(AnnotationsAttribute.visibleTag);
attribute.addAnnotation(tableAnnotation);
classFile.addAttribute(attribute);
classFile.setVersionToJava5();
//clazz.writeFile();
System.out.println("增强后Entity001:" + clazz.getAnnotation(Entity.class));
System.out.println("增强后Table002:" + clazz.getAnnotation(Table.class));
//TODO 当前ClassLoader中必须尚未加载该实体。(同一个ClassLoader加载同一个类只会加载一次)
c = clazz.toClass();
System.out.println("增强后toClass-Entity0001:" + c.getAnnotation(Entity.class));
System.out.println("增强后toClass-Table0002:" + c.getAnnotation(Table.class));
} catch (Exception e) {
e.printStackTrace();
}
return c;
}
public static void main(String[] args) {
ClassPoolUtils.tableMapping("com.andy.model.Order", "order1");
}
执行结果:
写道
增强前Entity01:@javax.persistence.Entity
增强前Table02:null
增强后Entity001:@javax.persistence.Entity
增强后Table002:@javax.persistence.Table(name="order1")
增强后toClass-Entity0001:@javax.persistence.Entity(name=)
增强后toClass-Table0002:@javax.persistence.Table(schema=, catalog=, uniqueConstraints=[], name=order1)
分享到:
相关推荐
主要介绍了java注解之运行时修改字段的注解值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
文件涵盖WOA源代码和源论文文件,W1文件夹是自己初学时修改后的代码,代码有注释,修改文件有助于初学者理解和修改为自己的预想结果
基于Matlab实现演示动态规划源码(带超详细注释).zip基于Matlab实现演示动态规划源码(带超详细注释).zip基于Matlab实现演示动态规划源码(带超详细注释).zip基于Matlab实现演示动态规划源码(带超详细注释).zip基于...
Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能,使开发者能够快速构建各种类型的应用程序。Ruby还有一个流行的Web框架Ruby on Rails,被广泛...
Java中提供了几个预定义的元注解,用于定制和修改注解的行为。让我们详细介绍一下Java中的元注解。 @Retention:这个元注解用于指定被注解的注解的保留策略。它有一个RetentionPolicy枚举类型的属性value,可以取...
基于Matlab的SSIM算法实现(源码+注释,直接运行),其中包括输入3维图像运行出错的修改,还有源码中部分参数,格式不正确的修改,直接运行出结果。PS:网上一些源码说可以直接运行,实则Copy,并没有修改,深受其害...
修改数据库连接和需要生成的表名后,可直接运行生成带中文注释和注解的JavaEntity,数据库注释会生成到JavaEntity里
至此oracle、mysql mybatis-generator自动生成代码(含中文注释) 1、打开generatorConfig.xml 2、修改数据库链接地址账号密码 将connectionURL修改为你所需生成的对象的数据库地址,修改用户名userId和密码password ...
本人课程设计代码,Linux上直接运行,代码注释详细,其中有详细的函数运行解释,很容易看懂,本人原创代码,有自己的特色,容易拿高分,也容易修改
在反向传播获修改加权时:在遍历当前层节点时 遍历下一层节点 找到对应的加权 (该部分过长,包含了详细的代码注释还有运行运行训练结果说明,就不搬过来了,请去我的blog看吧!) 总结: 可以看出结果还是比较符合...
批量修改文件名或者后缀,代码均有注释,可用于学习。 双击直接运行,有用户交互界面,可根据不同需求更改文件名或者后缀 可反复执行
基于Vue.js的动漫管理系统前端源代码+运行说明+注释 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1...
课程作业基于C++实现的的通讯录系统源码+超详细注释(显示菜单+添加+删除+修改+清空+退出).zip课程作业基于C++实现的的通讯录系统源码+超详细注释(显示菜单+添加+删除+修改+清空+退出).zip课程作业基于C++实现的的...
已经搭建好的ssh2架构,有自动建表功能,spring和hibernate的全注解,只要修改spring里的数据库连接密码,然后再在mysql命名一个first库,就可以用,所有表格根据类自动生成.开发方便
基于Python环神经网络预测正弦信号与短句源码+项目运行说明+详细注释.zip 二、文件夹结构功能 1.文件夹 - parameters:神经网络训练结果保存路径 - figure:该文档中的图片 2.文件 - activate.py:激活函数层,...
SVN提交时强制添加注释 —————————————————————————————————— 如果在windows环境中,则命名为pre-commit.bat并将该文件放在创建的库文件的hooks文件中 ————————————...
实现了无线阳光,无限金钱,自动跳关的功能,带所有源代码,可直接编译运行,通过修改内存地址实现,带详细注释!
完美运行,注释完整,兼容性好,新增删除功能,代码可直接使用无需修改!
2、如果安装Framework时修改了安装路径的需要自行解压“手动处理压缩包”中的相应的版本到安装目录 如:解压3.5的注解xml文件.rar 到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5 ...
C语言课设——校医院管理系统(含设计报告,程序源码,导出exe程序)可以直接运行无错误,注释详细 本系统采用C语言编写,分为用户端和医生端,主要实现预约和查找功能。其中数据存储采用数据流的方式存储为文本文档...