亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Hibernate 用 NULL 覆蓋列值?

Hibernate 用 NULL 覆蓋列值?

飲歌長嘯 2023-07-19 14:58:18
在插入/保存最后一個元素時,hibernate 會用 NULL 覆蓋前面元素的 ManyToOne 列。下面是詳細的描述。我正在創建一些“狀態”對象并將它們保存到數據庫中 -        Country usa = new Country ("USA", "330000000");        State mi = new State("MI", "11000000", usa);        State ca = new State("CA", "39900000", usa);        State fl = new State("FL", "21300000", usa);        countryRepository.save(usa);         stateRepository.save(mi);         stateRepository.save(ca);         stateRepository.save(fl);Hibernate 將按預期將“State”對象持久保存到數據庫中,直到持久保存最后一個“State”對象。這是觸發以下查詢并向國家/地區字段插入空值的地方。2019-09-09 11:45:37.390 DEBUG 9600 --- [  restartedMain] org.hibernate.SQL                        :     update        state     set        country_name=null     where        country_name=?2019-09-09 11:45:37.390 TRACE 9600 --- [  restartedMain] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [USA]因此在數據庫端,它導致country所有先前持久化狀態(表中的行)的字段被設置為空。然后它堅持最后的狀態 -2019-09-09 11:45:39.649 DEBUG 9600 --- [  restartedMain] org.hibernate.SQL                        :     insert     into        state        (country_name, population, name)     values        (?, ?, ?)2019-09-09 11:45:39.650 TRACE 9600 --- [  restartedMain] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [USA]2019-09-09 11:45:39.650 TRACE 9600 --- [  restartedMain] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [21300000]2019-09-09 11:45:39.650 TRACE 9600 --- [  restartedMain] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [VARCHAR] - [FL]生成的數據庫表如下 - 您可以看到 CA 和 MI 的國家/地區名稱為空值,但對于最后保存的州 FL 卻看不到空值。mysql> select * from state;+------+------------+--------------+| name | population | country_name |+------+------------+--------------+| CA   | 39900000   | NULL         || FL   | 21300000   | USA          || MI   | 11000000   | NULL         |+------+------------+--------------+任何關于為什么除了最后一個州之外的每個州都用空值覆蓋國家/地區字段的行為的任何提示。我不期望其他州的國家/地區為空值。
查看完整描述

1 回答

?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

如果你有,CascadeType.ALL你不需要做這一切

countryRepository.save(usa); 
stateRepository.save(mi); 
stateRepository.save(ca); 
stateRepository.save(fl);

我建議確保您將這些州添加到您所在國家的構造函數中的州列表中,然后保留該國家/地區。另外,當你確實需要它時,我不會使用FetchType.EAGER它,而是會獲取它,因為它會導致大量的 SQL 語句


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號