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

时间:2009-11-25 11:07:31

标签: hibernate save

我尝试使用以下代码插入或更新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更新记录而不是插入新的。我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

这是设计的。

Hibernate仅根据id决定是否应该执行更新或插入。如果它会考虑数据库中已存在的内容,则必须执行其他查询,但它不会执行此操作。

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

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

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

答案 1 :(得分:0)

如果表的rowcount是0,则尝试单独使用save方法,否则使用saveorupdate方法。