我尝试使用以下代码插入或更新数据库记录:
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(使用前将#替换为@)