AutoTable, Hibernate自动建立表替代方案

痛点

之前一直使用JPA为主要ORM技术栈,主要是因为Mybatis没有实体逆向建表功能。虽然Mybatis有从数据库建立实体,但是实际应用却没那么美好:当实体变更时,往往不会单独再建立一个数据库重新生成表,然后把表再逆向为实体。最终的结果往往是维护一份数据库SQL,再同时维护一份实体对象,两者没有自动建立关联。

方案

如果能够自动建立表,并自动维护系统初始的数据,该有多方便啊。

笔者实际的经验,十年前已经实现Hibernate自动建表+DBUnit自动初始数据(包括图片和相对数据,可见笔者其它文章)。

然而世界在发展,痛点终究有大牛出来解决,在Mybatis领域,最近出现了一个的替代解决方案:MybatisPlusExt,简称MPE。其中的自动建表已被MPE作者单独一个项目处理,叫做AutoTableAuto Table)自动维护表结构icon-default.png?t=N7T8https://autotable.tangzc.com/

迁移步骤

配置文件

autotable也有springboot starter。重新建表的逻辑,也有JAP类似的参数,因此,很容易可以进行迁移,改动点如下:

JPA

spring:jpa:database-platform: ${app.dataSource.hibernateDialect}generate-ddl: falseshow-sql: falseopen-in-view: falseproperties:hibernate.jdbc.time_zone: ${app.timeZone:GMT+8}

以及config里的配置Bean:

	@Value("${app.init.mode:none}")private String initMode;@Bean@ConfigurationProperties(prefix = "spring.datasource")public JpaVendorAdapter jpaVendorAdapter() {return new HibernateJpaVendorAdapter();}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){LocalContainerEntityManagerFactoryBean bean=new LocalContainerEntityManagerFactoryBean();      bean.setDataSource(dataSource);bean.setPackagesToScan(new String[] {"org.ccframe.subsys.*.domain.entity"});bean.setJpaVendorAdapter(jpaVendorAdapter);bean.getJpaPropertyMap().put("hibernate.hbm2ddl.auto",initMode);return bean;}

AutoTable

先导入starter依赖:


implementation ("com.tangzc:auto-table-spring-boot-starter:1.7.4") // 自动建表

然后书写格式:

auto-table:show-banner: falsemode: ${app.init.mode}model-package: org.ccframe.subsys.*.domain.entityindex-prefix: IDX_

Entity实体

以一个典型的带普通和Unique索引的实体User为例:

JPA

JPA+Hibernate方案

@Entity
@Table(name = "SYS_USER", indexes = {@Index(columnList = "USER_MOBILE"),@Index(columnList = "USER_EMAIL"),
}, uniqueConstraints = {@UniqueConstraint(columnNames = {"PLATFORM_ID","LOGIN_ID","USER_PSW"}),
})
@Getter
@Setter
@ToString
public class User extends BaseEntity{private static final long serialVersionUID = 6662916002685367792L;public static final String USER_ID = "userId";public static final String PLATFORM_ID = "platformId";public static final String LOGIN_ID = "loginId";public static final String USER_HEAD_PICT_ID = "userHeadPictId";public static final String USER_NAME = "userName";public static final String USER_PSW = "userPsw";public static final String USER_MOBILE = "userMobile";public static final String USER_EMAIL = "userEmail";public static final String USER_STATUS_CODE = "userStatusCode";public static final String IF_ADMIN = "ifAdmin";public static final String ROLE_CODE_STR = "roleCodeStr";@Id@GenericGenerator(name = "userId", strategy = "org.ccframe.commons.base.RedisIDGenerator")@GeneratedValue(generator = "userId")@Column(name = "USER_ID", nullable = false, length = 10)private Integer userId;@Column(name = "PLATFORM_ID", nullable = false, length = 10)private Integer platformId;@Column(name = "LOGIN_ID", nullable = false, length = 38)@Field(type = FieldType.Keyword)private String loginId;@Column(name = "USER_HEAD_PICT_ID", nullable = true, length = 10)private java.lang.Integer userHeadPictId;@Column(name = "USER_NAME", nullable = false, length = 32)private String userName;@Column(name = "USER_PSW", nullable = false, length = 128)private String userPsw;@Column(name = "USER_MOBILE", nullable = true, length = 17)private String userMobile;@Column(name = "USER_EMAIL", nullable = true, length = 70)private String userEmail;@Column(name = "IF_ADMIN", nullable = false, length = 2)@Field(type = FieldType.Keyword)private String ifAdmin;@Column(name = "USER_STATUS_CODE", nullable = false, length = 2)private String userStatusCode;@Column(name = "ROLE_CODE_STR", nullable = false, length = 80)private String roleCodeStr;
}

AutoTable

mybatis-plus + autotable的方案

@TableName("SYS_USER")
@AutoTable("SYS_USER")
@TableIndex(name = "UK66q7srks5eylhocxej5gs68mb", type= IndexTypeEnum.UNIQUE, fields = {"tenantId","loginId","userPsw"})
@TableIndex(name = "IDXbby41q9neesp2i6hatmlud01b", fields = "userMobile")
@TableIndex(name = "IDXhjkdbn8wxvwcdp7ohh7dch6i1", fields = "userEmail")
@Getter
@Setter
@ToString
public class User extends BaseEntity{private static final long serialVersionUID = 6662916002685367792L;public static final String USER_ID = "userId";public static final String TENANT_ID = "tenantId";public static final String LOGIN_ID = "loginId";public static final String USER_AVATAR = "userAvatar";public static final String USER_NAME = "userName";public static final String USER_PSW = "userPsw";public static final String USER_MOBILE = "userMobile";public static final String USER_EMAIL = "userEmail";public static final String USER_STATUS_CODE = "userStatusCode";public static final String IF_ADMIN = "ifAdmin";public static final String ROLE_CODE_STR = "roleCodeStr";@TableId(type = IdType.ASSIGN_ID)@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 120) @ColumnNotNullprivate Long userId;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 38) @ColumnNotNull@Field(type = FieldType.Keyword)private String loginId;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 48) @ColumnNotNullprivate String userAvatar;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 32) @ColumnNotNullprivate String userName;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 128) @ColumnNotNullprivate String userPsw;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 17)private String userMobile;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 70)private String userEmail;@Field(type = FieldType.Keyword)@ColumnType(value = MysqlTypeConstant.CHAR, length = 1)private String ifAdmin;@ColumnType(value = MysqlTypeConstant.CHAR, length = 1)private String userStatusCode;@ColumnType(value = MysqlTypeConstant.VARCHAR, length = 80)private String roleCodeStr;}

总结

AutoTable能够很好的兼容JPA的格式,实现自动建表的迁移。

但是有几个注意点:

1)索引需要进行命名,hibernate的是采用自动前缀+25位字符来自动实现索引的命名,我们不用去关心索引的名称。而迁移到AutoTable需要去起个不重复的名字。这个问题不大

2)hibernate采用方言的模式,可以兼容大部分数据库。而AutoTable的字段类型,需要指定数据库类型,如果要切换数据库,需要做实体代码定义的改动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渠道管控治理思路建议

品牌在做控价时,一定要有渠道一体化的治理想法,不能只能打击某一家店铺为想法进行治理,比如只打击非授权,只不去管理授权体系的经销商店铺,这显然是不行的,管理非授权的同时,授权也要管理好&…

QT+串口调试助手+扩展版

前言:此文章是这篇文章的拓展 QT串口调试助手基本版-CSDN博客,如果需要独立完成串口调试助手直接看基本版文章即可,如果需要完成串口调试助手的其他功能,参考拓展版。 一、更新QT串口调试助手UI界面 1、ui串口设置界面 2、ui串口…

华为OD机试【求满足条件的最长子串的长度】(java)(100分)

1、题目描述 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求: 只包含1个字母(a-z, A-Z),其余必须是数字&#xf…

Istio基础知识

一、什么是Istio Istio 提供⼀种简单的⽅式来为已部署的服务建⽴⽹络,该⽹络具有 负载均衡、服务间认证、监控等功能,只需要对服务的代码进⾏⼀点或不需要做任何改动。想要让服务⽀持 Istio,只需要在您的环境中部署⼀个特殊的 sidecar 代 理&…

工程技术SCI期刊,中科院3区,IF=3+,收稿范围广泛!

一、期刊名称 International Journal of Critical Infrastructure Protection 二、期刊简介概况 期刊类型:SCI 学科领域:工程技术 影响因子:3.6 中科院分区:3区 出版方式:订阅模式/开放出版 版面费:…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…

分布式领域计算模型及SparkRay实现对比

目录 一、分布式计算领域概览 二、Spark计算模型分析 三、Ray计算模型分析 3.1 需求分析 3.2 系统设计 3.3 系统实现 四、总结 一、分布式计算领域概览 当前分布式计算模型主要分为以下4种: Bulk Synchronous Parallel Model(块同步并行模型&…

【Linux 11】进程地址空间

文章目录 🌈 Ⅰ 虚拟地址引入🌈 Ⅱ 虚拟地址空间🌈 Ⅲ 页表 (解释 fork() 的返回值既 > 0 又 0)🌈 Ⅳ 什么是地址空间🌈 Ⅴ 为什么要有地址空间 🌈 Ⅰ 虚拟地址引入 现在通过一段代码来观察一个现象&a…

初识指针(1)<C语言>

前言 指针是C语言中比较难的一部分,大部分同学对于此部分容易产生“畏难情结”,但是学习好这部分对C语言的深入很大的帮助,所以此篇主要以讲解指针基础为主。 指针概念 变量创建的本质就是在内存中申请空间,找到这个变量就需要地址…

交互中的“互”难以产生的原因

脑机交互技术的目标是通过分析和解读大脑活动,将其与特定的意图、指令或行为连接起来。通过训练和分析,可以建立起大脑活动与特定行为或意图之间的关联模型,从而实现脑机交互的应用,例如控制外部设备、传递信息等。然而&#xff0…

Python机器学习实验 Python 数据可视化

1.实验目的 掌握 Matplotlib 数据可视化的常用方法。 2.实验内容 1. 绘制鸢尾花数据集的特征分布图 说明:鸢尾花是单子叶百合目花卉,是一种比较常见的花,鸢尾花的品种较多。 鸢尾花数据集最初由 Edgar Anderson 测量得到,而后在…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层:构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章:模板语法基础 Django模板语法介绍 Django模…

每天五分钟深度学习:数学中常见函数中的导数

本文重点 导数是微积分学中的一个核心概念,它描述了函数在某一点附近的变化率。在物理学、工程学、经济学等众多领域中,导数都发挥着极其重要的作用。本文旨在详细介绍数学中常见函数的导数,以期为读者提供一个全面而深入的理解。 数学中常见的导数 常数函数的导数 对于常数…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术&#xff0c;即时间敏感网络技术&#xff0c;已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能&#xff0c;确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展&#xff0c;工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…

Amazon EKS创建EFS存储卷

1、创建Amazon EFS CSI 驱动程序 亚马逊相关文档 在 Select trusted entity&#xff08;选择受信任的实体&#xff09;页面上操作 在 Add permissions&#xff08;添加权限&#xff09;页面上筛选AmazonEFSCSIDriverPolicy操作 记得将AmazonEBSVolumePolicy添加到我们创建的…

Colab/PyTorch - Getting Started with PyTorch

Colab/PyTorch - Getting Started with PyTorch 1. 源由2. 概要2.1 PyTorch是什么&#xff1f;2.2 为什么学习PyTorch&#xff1f;2.3 PyTorch库概览 3. 步骤4. 预期&展望5. 总结6. 参考资料 1. 源由 世界在发展&#xff0c;为其服务的技术也在不断演变。每个人都要跟上技…

Docker-Compose 容器集群的快速编排

Docker-compose 简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&…

2024阿里云ctf-web-chain17学习

agent jdk17依赖有h2思路清晰打jdbc attack <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.aliba…