为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信