I think that the problem can be that "user" has an empty set (not null object), so copyProperties is copying the empty Set of "user" into the existing Set with values of "dbUser" (so, when you save the dbUser, you are cleaning the Set). If you want to prevent also the copy of and empty set, you can change your method to:
public void copyProperty(Object dest, String name, Object value) throws IllegalAccessException, InvocationTargetException {
if (value == null) {
log.debug("skipping property " + name);
return;
}
if ((value instanceof Set) && ((Set) value).isEmpty()) {
log.debug("skipping empty Set" + name);
return;
}
super.copyProperty(dest, name, value);
}