我尝试使用以下代码插入或更新db记录:
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类设置器,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更新记录而不是插入新的。我在这里做错了什么?
答案 0 :(得分:5)
这是设计的。
Hibernate仅根据id决定是否应该执行更新或插入。如果它会考虑数据库中已存在的内容,则必须执行其他查询,但它不会执行此操作。
Ids通常由Hibernate管理,除非您将其映射为generator="assigned"
(不知道这看起来如何使用注释)。所以你不应该只为它分配一个值。
在这种情况下,Id甚至由数据库给出。因此,如果您的应用程序同时生成ID,则会导致重复的ID。 (并且大多数数据库不允许将值插入自动列,因此从技术上讲,无法存储您的ID。)
如果您想生成自己的ID,请使用generator="assigned"
,然后使用merge
存储它。这将按照您的期望执行:它搜索数据库中的记录,当它存在时将更新它,否则它将插入它。
答案 1 :(得分:0)
如果表的rowcount是0,则尝试单独使用save方法,否则使用saveorupdate方法。