Spring data jpa entidad separada

Comencé a trabajar en una aplicación Spring Boot usando Spring Data JPA para configurar una relación ManyToMany entre usuarios y roles.

Esta relación se define como sigue en la clase Usuario:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name="user_role", joinColumns = {@JoinColumn(name="user_id")}, inverseJoinColumns = {@JoinColumn(name="role_id")})
private Set<UserRole> roles;

Creo roles usando:

@Transactional
private void generateSeedRoles() {
    UserRole adminRole = new UserRole(RoleEnum.ADMIN.toString());
    userRoleRepository.save(adminRole);

    UserRole userRole = new UserRole(RoleEnum.USER.toString());
    userRoleRepository.save(userRole);
}

La asignación de roles a usuarios luego falla:

@Transactional
private void generateSeedUsers() {
    UserRole adminRole = userRoleRepository.findUserRoleByRoleName("ADMIN");

    User user = User.createUser("user1", "[email protected]", "pass");
    user.setRoles(new HashSet<UserRole>(Arrays.asList(adminRole)));

    userRepository.save(user);
}

Se produce la siguiente excepción (formateada para facilitar la lectura):

org.springframework.dao.InvalidDataAccessApiUsageException: 
detached entity passed to persist: co.feeb.models.UserRole; 
nested exception is org.hibernate.PersistentObjectException: 
detached entity passed to persist: co.feeb.models.UserRole

Sin embargo, si el usuario se guarda antes de crear la relación, funciona bien:

@Transactional
private void generateSeedUsers() {
    UserRole adminRole = userRoleRepository.findUserRoleByRoleName("ADMIN");

    User user = User.createUser("user1", "[email protected]", "pass");
    //Save user
    userRepository.save(user);

    //Build relationship and update user
    user.setRoles(new HashSet<UserRole>(Arrays.asList(adminRole)));
    userRepository.save(user);
}

Tener que guardar / actualizar al usuario dos veces me parece algo irracional. ¿Hay alguna forma de asignar el rol recibido alNuevo Usuario sin salvar al usuario primero?

Respuestas a la pregunta(1)

Su respuesta a la pregunta