User makes changes when an object is detached. The persistence provider is not involved in the process when the object is detached. The dirty flag is set on ALL fields that have their setters called - read the byte code enhancement contract. When an object is "merged" the persistence provider has no original value to compare against, so just takes the dirty flags. So it updates all dirty fields.