SpringBoot中JPA更新時(shí)部分字段無(wú)效
最近用JPA寫(xiě)業(yè)務(wù)代碼,發(fā)現(xiàn)了一個(gè)奇怪的bug,在通過(guò)注解自動(dòng)更新時(shí),部分字段在調(diào)試時(shí)可以找到,卻沒(méi)有被自動(dòng)更新到數(shù)據(jù)庫(kù)中。
相關(guān)源碼
實(shí)體類(lèi)定義
@Table(name = "t_workspace") @Entity @DynamicInsert @DynamicUpdate @org.hibernate.annotations.Table(appliesTo = "t_workspace", comment = "工作空間表") public class WorkSpaceEntity extends BaseEntity { @Column(columnDefinition = "TEXT COMMENT '模型圖結(jié)構(gòu)' ") private String mxGraphModel; @Convert(converter = ModelDataConver.class) @Column(columnDefinition = "mediumtext comment '存儲(chǔ)模型數(shù)據(jù)集'") private ModelData modelData; }
相關(guān)業(yè)務(wù)語(yǔ)句如下,用于更新mxGraphModel
與 modelData
workSpace.setMxGraphModel(newEntity.getMxGraphModel()); workSpace.setModelData(newEntity.getModelData());
但實(shí)際執(zhí)行的SQL語(yǔ)句如下
Hibernate: update t_workspace set wupdated_at=?, wmx_graph_model=? where wid=?
@DynamicUpdate適用屬性
如上所示,使用注解@DynamicUpdate自動(dòng)更新,但是該注解只能自動(dòng)更新實(shí)體屬性
。而實(shí)體屬性是指JPA認(rèn)定的基本數(shù)據(jù)類(lèi)型
以及關(guān)聯(lián)類(lèi)型
屬性。另外,如果實(shí)體類(lèi)中存在一些計(jì)算屬性或者需要在插入或更新時(shí)設(shè)置默認(rèn)值的屬性,那么這些屬性可能會(huì)被忽略,導(dǎo)致出現(xiàn)數(shù)據(jù)不一致的情況。
計(jì)算屬性
實(shí)體類(lèi)中的計(jì)算屬性指的是,這些屬性的值是根據(jù)其他屬性計(jì)算得出的,而不是從數(shù)據(jù)庫(kù)中直接獲取的。例如,訂單實(shí)體類(lèi)中的總金額屬性,可能是根據(jù)訂單項(xiàng)的數(shù)量和單價(jià)計(jì)算得出的,而不是從數(shù)據(jù)庫(kù)中直接獲取的。
插入或更新時(shí)設(shè)置默認(rèn)值
需要在插入或更新時(shí)設(shè)置默認(rèn)值的屬性,指的是這些屬性在插入或更新時(shí)需要設(shè)置默認(rèn)值,例如創(chuàng)建時(shí)間、更新時(shí)間、是否刪除等屬性。
這些屬性有以下特點(diǎn):
- 與數(shù)據(jù)庫(kù)表中的字段不一一對(duì)應(yīng),可能通過(guò)計(jì)算或者默認(rèn)值生成。
- 在讀取或者寫(xiě)入數(shù)據(jù)庫(kù)時(shí),需要特殊處理,以保證其值的正確性。
- 在使用動(dòng)態(tài) SQL 語(yǔ)句生成注解時(shí),需要特殊處理,以避免生成不必要的 SQL 語(yǔ)句。
JPA基本數(shù)據(jù)類(lèi)型
基本類(lèi)型指的是 Java 中的基本數(shù)據(jù)類(lèi)型,包括 byte、short、int、long、float、double、char、boolean 等。在 JPA 中,除了基本數(shù)據(jù)類(lèi)型之外,還包括一些 Java 類(lèi)型,例如 String、java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 等。
關(guān)聯(lián)類(lèi)型屬性
通過(guò)@OneToOne、@OneToMany、@ManyToOne、@ManyToMany注解的屬性
綜上
ModelData屬于自定義類(lèi),作為JPA的三等公民,沒(méi)有被優(yōu)待的權(quán)利。而JPA中對(duì)象即表的概念展現(xiàn)得淋漓盡致。
到此這篇關(guān)于SpringBoot中JPA更新時(shí)部分字段無(wú)效的文章就介紹到這了,更多相關(guān)JPA更新時(shí)部分字段無(wú)效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot2中HikariCP連接池的相關(guān)配置問(wèn)題
這篇文章主要介紹了springboot2中HikariCP連接池的相關(guān)配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12基于mybatis中test條件中單引號(hào)雙引號(hào)的問(wèn)題
這篇文章主要介紹了基于mybatis中test條件中單引號(hào)雙引號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringSecurity 自定義表單登錄的實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity 自定義表單登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Maven依賴(lài)junit?@Test報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Maven依賴(lài)junit?@Test報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Springboot詳細(xì)講解RocketMQ實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)流程
RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,本篇我們了解如何實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)2022-06-06Java泛型在集合使用與自定義及繼承上的體現(xiàn)和通配符的使用
泛型又稱(chēng)參數(shù)化類(lèi)型,是Jdk5.0 出現(xiàn)的新特性,解決數(shù)據(jù)類(lèi)型的安全性問(wèn)題,在類(lèi)聲明或?qū)嵗瘯r(shí)只要指定好需要的具體的類(lèi)型即可。Java泛型可以保證如果程序在編譯時(shí)沒(méi)有發(fā)出警告,運(yùn)行時(shí)就不會(huì)產(chǎn)生ClassCastException異常。同時(shí),代碼更加簡(jiǎn)潔、健壯2021-09-09java比較兩個(gè)list是否相同equals的代碼詳解
在本篇文章里小編給大家分享的是關(guān)于java比較兩個(gè)list是否相同equals的代碼詳解,有需要的朋友們可以參考學(xué)習(xí)下。2020-02-02