Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Data JPA 自动生成表列顺序混乱问题,老方法已失效,查收最新版吧

Spring Data JPA 自动生成表列顺序混乱问题,老方法已失效,查收最新版吧

作者头像
程序猿DD
发布于 2025-02-10 07:35:57
发布于 2025-02-10 07:35:57
13100
代码可运行
举报
文章被收录于专栏:程序猿DD程序猿DD
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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的实现,下面是老版本的解决步骤:

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

新版本解决方案

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 1. PropertyContainer类的包名从org.hibernate.cfg改到了org.hibernate.boot.model.internal
  2. 2. 之前的TreeMap<String XProperty> persistentAttributeMap变量没有了,但多了一个List<XProperty> persistentAttributes。进一步观察这个新变量的处理过程,可以看到如下逻辑:

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

  1. 1. 在工程中新建org.hibernate.boot.model.internal
  2. 2. 找到hibernate-core包下的org.hibernate.boot.model.internal下的PropertyContainer类,复制到本工程的org.hibernate.boot.model.internal包下
  3. 3. 把PropertyContainer类中,上面图中红色圈出部门定义的localAttributeMap = new TreeMap<>();修改为localAttributeMap = new LinkedHashMap<>();
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring与SpringBoot整合Spring Data JPA及使用
Spring Data JPA是Spring Data项目下的一个模块。提供了一套基于JPA标准操作数据库的简化方案,底层默认是依赖Hibernate JPA来实现的。
害恶细君
2022/11/22
4.7K0
Spring与SpringBoot整合Spring Data JPA及使用
JPA/Hibernate问题汇总
报错很明显,是由于hibernate的懒加载引起的。项目使用的是SpringBoot框架,JPA默认使用的是hibernate的实现,而hibernate的懒加载机制其实就是延迟加载对象,如果没有在session关闭前使用到对象里除id以外的属性时,就只会返回一个没有初始化过的包含了id的代理类。很多时候,这个代理类会引发上述的异常。
雨临Lewis
2022/01/12
2.7K0
Spring Data Jpa初体验(内含demo)
我一直在使用Mybatis作为持久化框架,并且觉得Mybatis十分的不错,足够灵活,虽说需要自己手写sql,但是这也是我觉得的一个优点,直观并且优化方便.
呼延十
2019/07/01
1K0
Spring Data Jpa初体验(内含demo)
快速学习-SpringBoot整合Spring Data JPA
5.3 SpringBoot整合Spring Data JPA 5.3.1 添加Spring Data JPA的起步依赖 <!-- springBoot JPA的起步依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 5.3.2 添加数据库驱动依赖 <!-- MySQL连接驱动 --
cwl_java
2020/04/01
3510
快速学习-SpringBoot整合Spring Data JPA
Spring 全家桶之 Spring Data JPA(五)
在resource目录下新增applicationContext.xml,新增以下内容
RiemannHypothesis
2022/08/19
2.2K0
Spring 全家桶之 Spring Data JPA(五)
快速学习-Spring Data JPA 入门
使用Spring Data JPA,需要整合Spring与Spring Data JPA,并且需要提供JPA的服务提供者hibernate,所以需要导入spring相关坐标,hibernate坐标,数据库驱动坐标等
cwl_java
2020/04/01
4300
spring boot 中使用 jpa以及jpa介绍
最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。 在这里我们先来了解一下jpa。
全栈程序员站长
2022/07/22
4.8K0
spring boot 中使用 jpa以及jpa介绍
Spring全家桶之SpringData——Spring Data JPA
举例: @JoinTable(name=“t_roles_menus”,joinColumns=@JoinColumn(name=“role_id”),inverseJoinColumns=@JoinColumn(name=“menu_id”))
时间静止不是简史
2020/07/24
4K0
Spring全家桶之SpringData——Spring Data JPA
SpringBoot整合Spring Data JPA
SpringBoot整合Spring Data JPA 1 添加Spring Data JPA的起步依赖 <!-- springBoot JPA的起步依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 2 添加数据库驱动依赖 <!-- MySQL连接驱动 --> <dependenc
名字是乱打的
2022/05/13
1.4K0
SpringBoot整合Spring Data JPA
Spring 全家桶之 Spring Data JPA(四)
只配置了客户到联系人的关系,查看执行的SQL,相比上一次测试多了一条update外键的sql语句
RiemannHypothesis
2022/08/19
1.7K0
Spring 全家桶之 Spring Data JPA(四)
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。
磊哥
2018/09/07
3.9K0
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
spring jpa 自动建表 字段乱序 字段 顺序
启动项目他就会自动创建你实体类中的表,创建完之后你会发现数据库里的字段和实体类里的字段顺序是不一样的 是乱序的 这是为啥子呢?是因为hibernate源码中用的是TreeMap存储实体类字段,TreeMap属性是无序的
stys35
2019/04/18
5.4K0
spring jpa 自动建表 字段乱序 字段 顺序
SpringBoot整合Spring Data JPA
Spring Data JPA 是采用基于JPA规范的Hibernate框架基础下提供了Repository层的实现。Spring Data Repository极大地简化了实现各种持久层的数据库访问而写的样板代码量,同时CrudRepository提供了丰富的CRUD功能去管理实体类。SpringBoot框架为Spring Data JPA提供了整合,spring-boot-starter-data-jpa能够让你快速使用这门技术,它提供了以下依赖。
烂猪皮
2023/09/04
4240
SpringBoot整合Spring Data JPA
SpringData JPA入门
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!
暴躁的程序猿
2022/03/24
4470
SpringData JPA入门
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException报错信息实体类报错原因
报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityM
用户5899361
2020/12/07
7050
Spring Data JPA 介绍和使用
Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。下面来逐步介绍它的强大功能。
乐百川
2022/05/05
3.8K0
Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页
本博客介绍基于Spring Data这款orm框架加上 Jquery.pagination插件实现的分页功能。
SmileNicky
2019/01/17
3.1K0
Spring整合Hibernate JPA
JPA:就是由Sun公司提供的一套对于持久层操作的标准(接口加文档),没有具体的实现。
害恶细君
2022/11/22
1.3K0
Spring Boot集成JPA的Column注解命名字段无效的问题
偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名。
pollyduan
2019/11/04
2.9K0
Spring Boot:整合Spring Data JPA
JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范。其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据。 简而言之,JPA提供了使用面向对象的方式操作数据库的功能。JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用、伸缩性强等优点。
朝雨忆轻尘
2019/06/19
2K0
Spring Boot:整合Spring Data JPA
相关推荐
Spring与SpringBoot整合Spring Data JPA及使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验