最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql設(shè)置默認(rèn)值無(wú)效問(wèn)題及解決

 更新時(shí)間:2023年10月18日 10:47:47   作者:檸檬不酸(LemonSour)  
這篇文章主要介紹了mysql設(shè)置默認(rèn)值無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

場(chǎng)景

  • 數(shù)據(jù)庫(kù)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)前的

即,沒(méi)有注解時(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í)(如果沒(méi)有做更改則無(wú)論有無(wú)注解均不會(huì)執(zhí)行update命令),無(wú)注解的將所有字段全都update為當(dāng)前值,有注解的則只update修改值。

在每次update之前,均會(huì)執(zhí)行select查詢出數(shù)據(jù)庫(kù)當(dāng)前該字段的狀態(tài)進(jìn)行比較后在執(zhí)行更新操作

網(wǎng)上有人說(shuō)@DynamicInsert這個(gè)注解的作用是,如果值為null,則不set該值。

從片面的角度來(lái)看,這句話是對(duì)的,如果我們?cè)趕ave時(shí)指定id,因?yàn)閕nsert對(duì)于一條記錄只會(huì)出現(xiàn)一次,在執(zhí)行insert之前,hibernate回去數(shù)據(jù)庫(kù)執(zhí)行select查詢,如果查詢不到數(shù)據(jù),那么我們當(dāng)前值的null和他當(dāng)前緩存種的值null是相等的,就認(rèn)為該值沒(méi)有修改,在后面執(zhí)行insert時(shí)mysql就會(huì)給該值賦予默認(rèn)值。

如果我們沒(méi)指定id,那么他就不會(huì)select,同理,跟緩存中的null相等,在組建insert語(yǔ)句時(shí)就不會(huì)附帶該值

那么有這么一種情況,假若我們save了一個(gè)新記錄,然后又update該記錄,但是在update時(shí),有個(gè)字段我們沒(méi)有賦值,其為null,那么跟從數(shù)據(jù)庫(kù)select出的數(shù)據(jù)發(fā)生了變化,就會(huì)set null向數(shù)據(jù)庫(kù)中,此時(shí)如果我們數(shù)據(jù)庫(kù)時(shí)not null的,就會(huì)報(bào)錯(cuò),反之,則會(huì)該字段的值被設(shè)為了null

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

扎鲁特旗| 林口县| 师宗县| 来凤县| 岳阳县| 澎湖县| 东辽县| 凌云县| 临洮县| 开封县| 富裕县| 宁晋县| 板桥市| 延安市| 通化县| 大邑县| 正镶白旗| 陆丰市| 金乡县| 乌拉特后旗| 资溪县| 宁海县| 陵川县| 佛教| 达拉特旗| 光山县| 绵阳市| 股票| 云安县| 宜章县| 英德市| 方正县| 常德市| 平泉县| 吉林市| 黄梅县| 龙泉市| 瑞丽市| 商城县| 大冶市| 昭通市|