So it just update existing record, but as per my knowledge it should create new record: Yes it should create a new record. But this behavior is only for transient objects not for persistent object.
The moment you load the object by calling load, this object is associated with session(persistent state). And because of dirty checking, this object would have anyway been updated during flush.
But, if this object was a new object, it would have actually made a difference in calling save() or saveoOrUpdate() api.