Spring Data JPA自動生成表時列順序混亂的最新解決辦法
最近把Spring Boot的版本升級到了3.3.5,突然發(fā)現(xiàn)一個問題:當(dāng)使用Spring Data JPA自動生成表的時候,所產(chǎn)生的列順序與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; }
實際自動創(chuàng)建出來的是這樣的:
自動創(chuàng)建的表結(jié)構(gòu)中各個列與Entity類中的變量順序不一致。其實該問題是一個老生常談的問題了,在DD這次升級的工程里是有做過解決方案的。只是升級了Spring Boot版本之后,之前的解決方案失效了。
搜索了一番,同時還問了一下AI,發(fā)現(xiàn)給出的方案還都是老的解決方案,所以今天特別寫一篇來記錄下新版本之下,要如何解決這個問題。如果您剛好遇到類似的問題,可以參考本文來解決。
老版本解決方案
新老版本的解決思路是類似的,都是替換Hibernate的實現(xiàn),下面是老版本的解決步驟:
- 在工程中新建
org.hibernate.cfg
包 - 找到
hibernate-core
包下的org.hibernate.cfg
下的PropertyContainer
類,復(fù)制到本工程的org.hibernate.cfg
包下 - 把
PropertyContainer
類中定義的persistentAttributeMap
類型從TreeMap
修改為LinkedHashMap
新版本解決方案
雖然之前的方案失效了,但思路應(yīng)該還是對的,所以第一反應(yīng)是看看當(dāng)前版本下的PropertyContainer
類,具體如下(省略了一些不重要的內(nèi)容):
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
類,復(fù)制到本工程的org.hibernate.boot.model.internal
包下 - 把
PropertyContainer
類中,上面圖中紅色圈出部門定義的localAttributeMap = new TreeMap<>();
修改為localAttributeMap = new LinkedHashMap<>();
到這里,在新版本中的這個問題就解決了。如果你也遇到了類似的問題,希望本文對你有所幫助。
到此這篇關(guān)于Spring Data JPA自動生成表時列順序混亂的解決辦法最新版的文章就介紹到這了,更多相關(guān)Spring Data JPA自動生成表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot里增加表單驗證hibernate-validator并在freemarker模板里顯示錯誤信息(推
這篇文章主要介紹了spring boot里增加表單驗證hibernate-validator并在freemarker模板里顯示錯誤信息的相關(guān)資料,需要的朋友可以參考下2018-01-01java使用CollectionUtils工具類判斷集合是否為空方式
這篇文章主要介紹了java使用CollectionUtils工具類判斷集合是否為空方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java?MapStruct優(yōu)雅地實現(xiàn)對象轉(zhuǎn)換
MapSturct?是一個生成類型安全,高性能且無依賴的?JavaBean?映射代碼的注解處理器,用它可以輕松實現(xiàn)對象轉(zhuǎn)換,下面就來和大家聊聊具體操作吧2023-06-06Java中將String轉(zhuǎn)換為char數(shù)組的三種方式
這篇文章主要介紹了三種將字符串轉(zhuǎn)換為字符數(shù)組的方法,分別是toCharArray()、charAt()和循環(huán)、getChars(),每種方法都有其適用場景和優(yōu)缺點,需要的朋友可以參考下2024-12-12解析Orika的MapperFacade 屬性賦值的使用問題
在我們實際開發(fā)中,常常會有對象與對象之間的轉(zhuǎn)化,或者把一個對象的數(shù)據(jù)轉(zhuǎn)化到另一個數(shù)據(jù)之中,如果我們手動的一個一個的set就會比較麻煩,代碼段看起來也會比較長。而Orika的MapperFacade就是解決這個問題的,實現(xiàn)對象屬性的復(fù)制2021-12-12spring cloud oauth2 實現(xiàn)用戶認證登錄的示例代碼
這篇文章主要介紹了spring cloud oauth2 實現(xiàn)用戶認證登錄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10