最近升级了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的实现。以下是老版本的解决步骤:
org.hibernate.cfg
hibernate-core
org.hibernate.cfg
PropertyContainer
org.hibernate.cfg
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技术交流群,参与交流与讨论,更好地学习与进步!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源