当我在空表上执行 Hibernate saveOrUpdate 时失败

2024-05-13

我尝试使用以下代码插入或更新数据库记录:

Category category = new Category(); 
category.setName('catName');
category.setId(1L);
categoryDao.saveOrUpdate(category);

当数据库中已有 id=1 的类别时,一切正常。但如果没有 记录 id=1 我得到以下异常:

org.hibernate.StaleStateException:
Batch update returned unexpected row count from update [0]; actual row count: 0; 
expected: 1:

以下是我的 Category 类设置器、获取器和构造函数,为了清楚起见,省略了这些设置器、获取器和构造函数:

@Entity
public class Category {    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToOne
    private Category parent;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
    private List<Category> categories = new ArrayList<Category>();
}

在控制台中我看到这个休眠查询:

update
    Category
set
    name=?,
    parent_id=?
where
    id=?

所以看起来休眠试图更新记录而不是插入新记录。我在这里做错了什么?


这是设计使然。

Hibernate 仅根据 id 决定是否应该执行更新或插入。如果它考虑数据库中已有的内容,则必须执行额外的查询,但它不会这样做。

Id 通常由 Hibernate 管理,除非您将其映射为generator="assigned"(不知道使用注释看起来如何)。所以你不应该只给它赋值。

在这种情况下,Id 甚至是由数据库给出的。因此,如果您的应用程序同时生成 Id,则会导致 Id 重复。 (大多数数据库不允许将值插入自动列,因此技术上不可能存储您的 id)。

如果您想生成自己的 Id,请使用generator="assigned",并使用存储它merge。这将执行您所期望的操作:它在数据库中搜索记录,当存在时它将更新它,当不存在时它将插入它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我在空表上执行 Hibernate saveOrUpdate 时失败 的相关文章

随机推荐

  • PHP preg_replace - www 或 http://

    真正坚持看似简单的事情 我有一个聊天框 喊叫框 其中可能输入任意 URL 我想找到每个单独的 URL 用空格分隔 并将其包装在标签中 例子 Harry you re a http google com http google com wiz
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 与 Write-Host 相比,Write-Output 的使用非常不可靠

    有人指出一个问题 如果我希望命令按顺序操作 建议使用 Write Output 而不是 Write Host 因为 Write Host 不会将输出放在管道上 而其他命令却这样做 这意味着 Write Host 输出可以发生在管道上的其他命
  • 尝试在 JavaScript 中循环前 50 个偶数斐波那契数时出现错误输出 [重复]

    这个问题在这里已经有答案了 我是 JavaScript 新手 无法让我的代码正常工作 非常感谢任何帮助 指导 当尝试 显示前 50 个偶数斐波那契数的总和 时 我得到错误的输出 当前为 9 715575428267785e 30 我需要 1
  • 如何在pop UIViewController中删除UIParallaxDimmingView?

    我有一个UIViewController vc1这是在之后推送的UIViewController vc2 Both vc1 and vc2具有透明背景 问题 当我尝试弹出时vc2使用交互式弹出手势 从边缘平移 在我看来堆栈显得很神秘UIPa
  • 如何使用 Bower_components 中安装的软件包更新 Bower.json

    如何更新bower json已安装的软件包来自bower components bower init没有将我安装的所有软件包添加到bower json 有些明显缺失 bower list无法在一个包上连接到 github 那么这样做的正确方
  • 向每个 ViewPager 幻灯片添加多个图像和文本

    我有一个带有 3 张幻灯片的 ViewPager 我希望能够在每张幻灯片上添加 3 张图像和几个不同的文本标签 我当前拥有的代码允许我向每张幻灯片添加单个图像 我对如何在每张幻灯片上使用多个图像和文本进行这项工作感到困惑 任何帮助 将不胜感
  • 当结构体包含字符串时为其分配内存

    假设如果我有一个这样的结构 struct node note that i have changed the struct code according to my convenience char lastname char employ
  • 替代 header("Content-type: text/xml");

    是否存在与以下内容等效的内容 header Content type text xml 我将 Google 地图与 Wordpress 一起使用 但收到 标头已发送 错误 我已经检查了所有文件并删除了所有空白 但错误仍然出现 所以只是想知道
  • 我想在 64 位模式下运行我的视觉工作室

    我正在 NET 3 5 中编写 Web 服务 在此我必须访问 SharePoint 2010 数据 但 SharePoint 需要我的应用程序使用 64 位模式 Visual Studio 默认处于 32 位模式 如何以 64 位运行 Vi
  • 将 JSON 转换为对象失败 - 无法将当前 JSON 对象反序列化为 System.Collections.Generic.List

    我正在使用 www textlocal in 的 API 它返回 JSON 格式的对象 JSON warnings message Number is in DND numbers 917000000000 balance 900 batc
  • 查找并替换超过 1 个单词?

    我需要使用 jQuery 更改页面上的一堆不同的单词 这是我到目前为止的代码 function var thePage body thePage html thePage html replace My Classes g My Level
  • C++ 凯撒密码程序

    我正在尝试用 C 编写凯撒密码程序 我使用四个函数 一个用于选择 Shift key 两个用于加密和解密 最后一个用于实现凯撒密码 使用输入文件读取文本并将加密或解密的文本输出到输出文件中 我正在尝试运行代码 但它崩溃了 我认为问题出在凯撒
  • 检测 UISwitch 的变化

    这听起来微不足道 但我注意到一些奇怪的地方 我已经为 UISwitch 的 Value Changed 事件连接了一个处理程序 我会做什么expect是每次调用处理程序时 开关的值都会改变 但实际上并非如此always案子 如果您快速按下开
  • 通过 Maven 到达罗马

    我正在使用 Maven 并且希望开始在项目中使用 Rome 当我在 Eclipse 的 m2 实例中查找 rome 时 我得到了一些结果 net java dev rome rome 1 0 0 2010 04 17 org rometoo
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • Python 中 datetime.timedelta 的人类可读日期时间间隔?

    我发现自己经常需要在 python 配置文件中指定时间跨度 有没有一种方法可以让我在带有 stdlib 的 python 配置文件中指定更易读的时间范围 类似于 PostgreSQL 的 Interval 语法 或者这需要第三方库吗 澄清我
  • jQuery 按 1 个 td 的值对表行进行排序

    您将如何按以下顺序对该表进行排序pts我有的课程 table tr th rank th th team th th pts th tr tr td 1 td td Chelsea td td class pts 3 td tr tr td
  • 如何在多个包之间共享analysis_options.yaml 文件?

    我正在开发一个Flutter Module 多种的Flutter Plugins 他们之间的关系是 module取决于所有plugins 所有插件均未发布到 pub 并使用 git 依赖项 我现在需要添加analysis options y
  • 当我在空表上执行 Hibernate saveOrUpdate 时失败

    我尝试使用以下代码插入或更新数据库记录 Category category new Category category setName catName category setId 1L categoryDao saveOrUpdate c