gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:00:47 27 4
gpt4 key购买 nike

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

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:

为了清楚起见,这里省略了我的类别类 setter 、 getter 和构造器:

@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>();
}

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

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

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

最佳答案

这是设计使然。

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

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

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

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

关于当我在空表上执行 Hibernate saveOrUpdate 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1796221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com