Have a look at the following link: -
http://www.hibernate.org/hib_docs/v3/re ... ild-update
You have a case where the id is assigned by the user before save similar to the case of composite id. When the child is passed to saveorupdate it would always get updated. If the id was generated, then an unsaved value say 'null' for the id would tell Hibernate that this is a new object and it should be inserted.
You could either change the way you are setting the id for the child or use the timestamp or version property.