Aquí está el código:¿Por qué utilizar la instancia devuelta después de guardar() en Spring Data JPA Repository?
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
JpaRepository del proyecto de Primavera de datos JPA.
Aquí está el código de prueba:
public class JpaAccountRepositoryTest extends JpaRepositoryTest {
@Inject
private AccountRepository accountRepository;
@Inject
private Account account;
@Test
@Transactional
public void createAccount() {
Account returnedAccount = accountRepository.save(account);
System.out.printf("account ID is %d and for returned account ID is %d\n", account.getId(), returnedAccount.getId());
}
}
aquí está el resultado:
account ID is 0 and for returned account ID is 1
Aquí es de CrudReporsitory.save() javadoc:
ahorra una entidad determinada. Utilice la instancia devuelta para realizar más operaciones ya que la operación de salvar podría haber cambiado la instancia de la entidad por completo.
Este es el código real para SimpleJpaRepository partir de la primavera de datos JPA:
@Transactional
public T save(T entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Entonces, la pregunta es ¿por qué tenemos que utilizar la instancia devuelta en lugar de la original? (Sí, debemos hacerlo, de lo contrario seguiremos trabajando con instancia separada, pero ¿por qué?)
El método original EntityManager.persist() devuelve vacío, por lo que nuestra instancia se adjunta al contexto de persistencia. ¿Se produce algo de magia proxy al pasar la cuenta para guardarla en el repositorio? ¿Es la limitación de la arquitectura del proyecto Spring Data JPA?
¿Puedo suponer que es seguro no utilizar los resultados de devolución para nuevas entidades? – danidacar
¿Dónde hay documentación sobre el estado del objeto devuelto? Es decir, a veces devuelve campos actualizados (marcas de tiempo), a veces los campos no se actualizan desde la base de datos. – mmcrae