Vladimir
Vladimir

Reputation: 13173

Hibernate saveOrUpdate fails when I execute it on empty table

I'm try to insert or update db record with following code:

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

When there is a category with id=1 already in database everything works. But if there is no record with id=1 I got following exception:

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

Here is my Category class setters, getters and constructors ommited for clarity:

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

In the console I see this hibernate query:

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

So looks like hibernates tryis to update record instead of inserting new. What am I doing wrong here?

Upvotes: 3

Views: 3748

Answers (2)

Stefan Steinegger
Stefan Steinegger

Reputation: 64628

This is by design.

Hibernate only decides based on the id if it should perform an update or an insert. If it would consider what's already there in the database, it would have to perform an additional query, but it doesn't do this.

Ids are normally managed by Hibernate, unless you map it as generator="assigned" (don't know how this looks using annotations). So you shouldn't just assign a value to it.

In this case, the Id is even given by the database. So if your application would generate Ids at the same time, it would result in duplicated Ids. (And most database do not allow inserting values to auto columns, so it would technically be impossible to store your id).

If you want to generate your own Ids, use generator="assigned", and store it using merge. This will do what you expect: it searches the record in the database, when it exists it will update it, when not it will insert it.

Upvotes: 5

Sadesh Kumar N
Sadesh Kumar N

Reputation: 2052

try to use save method alone if the rowcount of the table is 0 else use saveorupdate method.

Upvotes: 0

Related Questions