mysql設(shè)置默認(rèn)值無效問題及解決
場景
- 數(shù)據(jù)庫mysql
- 框架hibernate
原因
根據(jù)hibernate打印出的sql信息可以發(fā)現(xiàn),如果實(shí)體類字段為null,則仍會(huì)insert這個(gè)字段為null,而mysql設(shè)置的默認(rèn)值生效的前提是,
當(dāng)我們insert一條記錄時(shí),我們不指定某字段的值,他才會(huì)自動(dòng)生成默認(rèn)值,
而我們用save的時(shí)候指定該字段的值為null,此時(shí)如果我們mysql設(shè)置的為not null,那么同時(shí)也會(huì)報(bào)錯(cuò)
解決
- @DynamicInsert(默認(rèn)為true)
- @DynamicUpdate(默認(rèn)為true)
這兩個(gè)注解是類注解,作用為:
當(dāng)插入/更新一條記錄時(shí),只insert/update改變的信息,而不是將所有字段都update為當(dāng)前的
即,沒有注解時(shí)update的sql為
Hibernate: select student0_.id as id1_0_0_, student0_.default_value as default_2_0_0_, student0_.password as password3_0_0_, student0_.username as username4_0_0_ from user_student student0_ where student0_.id=? Hibernate: update user_student set default_value=?, password=?, username=? where id=?
有注解時(shí)的sql為
Hibernate: select student0_.id as id1_0_0_, student0_.default_value as default_2_0_0_, student0_.password as password3_0_0_, student0_.username as username4_0_0_ from user_student student0_ where student0_.id=?
Hibernate: update user_student set username=? where id=?
可以看到,當(dāng)需要update時(shí)(如果沒有做更改則無論有無注解均不會(huì)執(zhí)行update命令),無注解的將所有字段全都update為當(dāng)前值,有注解的則只update修改值。
在每次update之前,均會(huì)執(zhí)行select查詢出數(shù)據(jù)庫當(dāng)前該字段的狀態(tài)進(jìn)行比較后在執(zhí)行更新操作
網(wǎng)上有人說@DynamicInsert這個(gè)注解的作用是,如果值為null,則不set該值。
從片面的角度來看,這句話是對的,如果我們在save時(shí)指定id,因?yàn)閕nsert對于一條記錄只會(huì)出現(xiàn)一次,在執(zhí)行insert之前,hibernate回去數(shù)據(jù)庫執(zhí)行select查詢,如果查詢不到數(shù)據(jù),那么我們當(dāng)前值的null和他當(dāng)前緩存種的值null是相等的,就認(rèn)為該值沒有修改,在后面執(zhí)行insert時(shí)mysql就會(huì)給該值賦予默認(rèn)值。
如果我們沒指定id,那么他就不會(huì)select,同理,跟緩存中的null相等,在組建insert語句時(shí)就不會(huì)附帶該值
那么有這么一種情況,假若我們save了一個(gè)新記錄,然后又update該記錄,但是在update時(shí),有個(gè)字段我們沒有賦值,其為null,那么跟從數(shù)據(jù)庫select出的數(shù)據(jù)發(fā)生了變化,就會(huì)set null向數(shù)據(jù)庫中,此時(shí)如果我們數(shù)據(jù)庫時(shí)not null的,就會(huì)報(bào)錯(cuò),反之,則會(huì)該字段的值被設(shè)為了null
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
sqoop export導(dǎo)出 map100% reduce0% 卡住的多種原因及解決
這篇文章主要介紹了sqoop export導(dǎo)出 map100% reduce0% 卡住的多種原因及解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)表的方法
這篇文章主要介紹了mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)表的方法,有需要的朋友可以參考一下2013-11-11MySQL觸發(fā)器的使用和優(yōu)缺點(diǎn)介紹
大家好,本篇文章主要講的是MySQL觸發(fā)器的使用和優(yōu)缺點(diǎn)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦,方便下次瀏覽2021-12-12