久趣下载站

当前位置: 首页 » 游戏攻略 » Spring Boot版本升级后解决Spring Data JPA自动生成表列顺序问题

Spring Boot版本升级后解决Spring Data JPA自动生成表列顺序问题

最近升级了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类中的变量顺序不一致。尽管之前的解决方案在之前的工程中是有效的,但在升级Spring Boot版本后,该解决方案失效了。

在搜索和咨询后发现,提供的解决方案仍然是老版本的。因此,本文旨在记录如何解决这个问题,特别适用于遇到类似问题的开发者。

老版本解决方案

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

  1. 在工程中新建

    org.hibernate.cfg

  2. 找到

    hibernate-core

    包下的

    org.hibernate.cfg

    下的

    PropertyContainer

    类,复制到本工程的

    org.hibernate.cfg

    包下


  3. 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;

	//省略...

}

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


  1. PropertyContainer

    类的包名从

    org.hibernate.cfg

    改为

    org.hibernate.boot.model.internal
  2. 之前的

    TreeMap<String XProperty> persistentAttributeMap

    变量没有了,但多了一个

    List<XProperty> persistentAttributes

    。进一步观察这个新变量的处理过程,可以看到如下逻辑:

因此,新版的解决方案包括以下两个步骤:

  1. 在工程中新建

    org.hibernate.boot.model.internal

  2. 找到

    hibernate-core

    包下的

    org.hibernate.boot.model.internal

    下的

    PropertyContainer

    类,复制到本工程的

    org.hibernate.boot.model.internal

    包下


  3. PropertyContainer

    类中,上面图中红色圈出部门定义的

    localAttributeMap = new TreeMap<>();

    修改为

    localAttributeMap = new LinkedHashMap<>();

通过上述步骤,新版本中的问题得以解决。如果您也遇到了类似的问题,希望本文对您有所帮助。另外,欢迎加入我们的Spring技术交流群,参与交流与讨论,更好地学习与进步!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

猜你喜欢
本类排行