Spring Data JPA主动生成表时列顺序杂乱的解决办法(最新版) ...

种地  金牌会员 | 2024-11-27 10:20:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

最近把Spring Boot的版本升级到了3.3.5,忽然发现一个题目:当使用Spring Data JPA主动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了。比如,有一个下面这样的Entity:
  1. @Data
  2. @Entity(name = "t_config")
  3. @EntityListeners(AuditingEntityListener.class)
  4. public class Config {
  5.     @Id
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  7.     private Long id;
  8.    
  9.     @Column(length = 20)
  10.     private String itemKey;
  11.     @Column(length = 200)
  12.     private String itemValue;
  13.     @Column(length = 200)
  14.     private String itemDesc;
  15.     @CreatedDate
  16.     private Date createTime;
  17.     @LastModifiedDate
  18.     private Date modifyTime;
  19. }
复制代码
实际主动创建出来的是这样的:

主动创建的表结构中各个列与Entity类中的变量顺序不一致。实在该题目是一个老生常谈的题目了,在DD这次升级的工程里是有做过解决方案的。只是升级了Spring Boot版本之后,之前的解决方案失效了。
搜索了一番,同时还问了一下AI,发现给出的方案还都是老的解决方案,以是今天特殊写一篇来记载下新版本之下,要如何解决这个题目。如果您刚好遇到类似的题目,可以参考本文来解决。
老版本解决方案

新老版本的解决思路是类似的,都是替换Hibernate的实现,下面是老版本的解决步骤:

  • 在工程中新建org.hibernate.cfg包
  • 找到hibernate-core包下的org.hibernate.cfg下的PropertyContainer类,复制到本工程的org.hibernate.cfg包下
  • 把PropertyContainer类中定义的persistentAttributeMap类型从TreeMap修改为LinkedHashMap
新版本解决方案

虽然之前的方案失效了,但思路应该还是对的,以是第一反应是看看当前版本下的PropertyContainer类,详细如下(省略了一些不紧张的内容):
  1. package org.hibernate.boot.model.internal;
  2. //省略...
  3. public class PropertyContainer {
  4.     private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, PropertyContainer.class.getName());
  5.     /**
  6.      * The class for which this container is created.
  7.      */
  8.     private final XClass xClass;
  9.     private final XClass entityAtStake;
  10.     /**
  11.      * Holds the AccessType indicated for use at the class/container-level for cases where persistent attribute
  12.      * did not specify.
  13.      */
  14.     private final AccessType classLevelAccessType;
  15.     private final List<XProperty> persistentAttributes;
  16.         //省略...
  17. }
复制代码
可以看到有两个紧张变化部分:

  • PropertyContainer类的包名从org.hibernate.cfg改到了org.hibernate.boot.model.internal
  • 之前的TreeMap persistentAttributeMap变量没有了,但多了一个List persistentAttributes。进一步观察这个新变量的处置惩罚过程,可以看到如下逻辑:

以是,新版的方案就以下两个步骤:

  • 在工程中新建org.hibernate.boot.model.internal包
  • 找到hibernate-core包下的org.hibernate.boot.model.internal下的PropertyContainer类,复制到本工程的org.hibernate.boot.model.internal包下
  • 把PropertyContainer类中,上面图中红色圈出部分定义的localAttributeMap = new TreeMap();修改为localAttributeMap = new LinkedHashMap();
到这里,在新版本中的这个题目就解决了。如果你也遇到了类似的题目,盼望本文对你有所帮助。别的,欢迎参加我们的Spring技术交流群,到场交流与讨论,更好的学习与进步!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表