Spring Data JPA自动生成表时列顺序混乱的最新解决办法

 更新时间:2024年11月28日 09:16:55   作者:程序猿DD  
文章主要介绍了Spring Boot 3.3.5版本中SpringDataJPA自动生成表时列顺序混乱的问题,以及如何通过替换Hibernate实现来解决这个问题,感兴趣的朋友跟随小编一起看看吧

最近把Spring Boot的版本升级到了3.3.5,突然发现一个问题:当使用Spring Data JPA自动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了。比如,有一个下面这样的Entity:

@Data
@Entity(name = "t_config")
@EntityListeners(AuditingEntityListener.class)
public class Config {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(length = 20)
    private String itemKey;
    @Column(length = 200)
    private String itemValue;
    @Column(length = 200)
    private String itemDesc;
    @CreatedDate
    private Date createTime;
    @LastModifiedDate
    private Date modifyTime;
}

实际自动创建出来的是这样的:

自动创建的表结构中各个列与Entity类中的变量顺序不一致。其实该问题是一个老生常谈的问题了,在DD这次升级的工程里是有做过解决方案的。只是升级了Spring Boot版本之后,之前的解决方案失效了。

搜索了一番,同时还问了一下AI,发现给出的方案还都是老的解决方案,所以今天特别写一篇来记录下新版本之下,要如何解决这个问题。如果您刚好遇到类似的问题,可以参考本文来解决。

老版本解决方案

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

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

新版本解决方案

虽然之前的方案失效了,但思路应该还是对的,所以第一反应是看看当前版本下的PropertyContainer类,具体如下(省略了一些不重要的内容):

package org.hibernate.boot.model.internal;
//省略...
public class PropertyContainer {
    private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, PropertyContainer.class.getName());
    /**
     * The class for which this container is created.
     */
    private final XClass xClass;
    private final XClass entityAtStake;
    /**
     * Holds the AccessType indicated for use at the class/container-level for cases where persistent attribute
     * did not specify.
     */
    private final AccessType classLevelAccessType;
    private final List<XProperty> persistentAttributes;
	//省略...
}

可以看到有两个重要变化部分:

  • PropertyContainer类的包名从org.hibernate.cfg改到了org.hibernate.boot.model.internal
  • 之前的TreeMap<String XProperty> persistentAttributeMap变量没有了,但多了一个List<XProperty> 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 Data JPA自动生成表时列顺序混乱的解决办法最新版的文章就介绍到这了,更多相关Spring Data JPA自动生成表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java JDK1.7对字符串的BASE64编码解码方法

    Java JDK1.7对字符串的BASE64编码解码方法

    今天小编就为大家分享一篇Java JDK1.7对字符串的BASE64编码解码方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)

    spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推

    这篇文章主要介绍了spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息的相关资料,需要的朋友可以参考下
    2018-01-01
  • java使用CollectionUtils工具类判断集合是否为空方式

    java使用CollectionUtils工具类判断集合是否为空方式

    这篇文章主要介绍了java使用CollectionUtils工具类判断集合是否为空方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java MapStruct优雅地实现对象转换

    Java MapStruct优雅地实现对象转换

    MapSturct 是一个生成类型安全,高性能且无依赖的 JavaBean 映射代码的注解处理器,用它可以轻松实现对象转换,下面就来和大家聊聊具体操作吧
    2023-06-06
  • java协变返回类型使用示例

    java协变返回类型使用示例

    在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更"狭窄"的类型
    2014-02-02
  • Java 基础语法

    Java 基础语法

    这篇文章主要介绍了Java 基础语法,Java 是一门面向对象的解释型编程语言,面向对象 意味着我们应该把一个 Java 程序看作一系列对象的集合,我们的工作就是构建这些对象,并通过调用彼此的方法来让各种对象协同工作,解决实际的问题,下面文章内容需要的朋友可以参考下一
    2021-11-11
  • Java中将String转换为char数组的三种方式

    Java中将String转换为char数组的三种方式

    这篇文章主要介绍了三种将字符串转换为字符数组的方法,分别是toCharArray()、charAt()和循环、getChars(),每种方法都有其适用场景和优缺点,需要的朋友可以参考下
    2024-12-12
  • 解析Orika的MapperFacade 属性赋值的使用问题

    解析Orika的MapperFacade 属性赋值的使用问题

    在我们实际开发中,常常会有对象与对象之间的转化,或者把一个对象的数据转化到另一个数据之中,如果我们手动的一个一个的set就会比较麻烦,代码段看起来也会比较长。而Orika的MapperFacade就是解决这个问题的,实现对象属性的复制
    2021-12-12
  • java分割字符串多种方法(附例子)

    java分割字符串多种方法(附例子)

    这篇文章主要给大家介绍了关于java分割字符串多种方法的相关资料,Java中有多种方法可以实现字符串分割,文中将每张方法都给出了代码示例,需要的朋友可以参考下
    2023-10-10
  • spring cloud oauth2 实现用户认证登录的示例代码

    spring cloud oauth2 实现用户认证登录的示例代码

    这篇文章主要介绍了spring cloud oauth2 实现用户认证登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论