在插入/保存最后一個(gè)元素時(shí),hibernate 會(huì)用 NULL 覆蓋前面元素的 ManyToOne 列。下面是詳細(xì)的描述。我正在創(chuàng)建一些“狀態(tài)”對(duì)象并將它們保存到數(shù)據(jù)庫(kù)中 - 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 將按預(yù)期將“State”對(duì)象持久保存到數(shù)據(jù)庫(kù)中,直到持久保存最后一個(gè)“State”對(duì)象。這是觸發(fā)以下查詢并向國(guó)家/地區(qū)字段插入空值的地方。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]因此在數(shù)據(jù)庫(kù)端,它導(dǎo)致country所有先前持久化狀態(tài)(表中的行)的字段被設(shè)置為空。然后它堅(jiān)持最后的狀態(tài) -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]生成的數(shù)據(jù)庫(kù)表如下 - 您可以看到 CA 和 MI 的國(guó)家/地區(qū)名稱為空值,但對(duì)于最后保存的州 FL 卻看不到空值。mysql> select * from state;+------+------------+--------------+| name | population | country_name |+------+------------+--------------+| CA | 39900000 | NULL || FL | 21300000 | USA || MI | 11000000 | NULL |+------+------------+--------------+任何關(guān)于為什么除了最后一個(gè)州之外的每個(gè)州都用空值覆蓋國(guó)家/地區(qū)字段的行為的任何提示。我不期望其他州的國(guó)家/地區(qū)為空值。
Hibernate 用 NULL 覆蓋列值?
飲歌長(zhǎng)嘯
2023-07-19 14:58:18