在插入/保存最后一个元素时,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 |
+------+------------+--------------+
任何关于为什么除了最后一个州之外的每个州都用空值覆盖国家/地区字段的行为的任何提示。我不期望其他州的国家/地区为空值。
qq_笑_17
相关分类