ecco il codice:Perché utilizzare l'istanza restituita dopo save() nel repository JPA di Spring Data?
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
JpaRepository dal progetto Primavera dati JPA.
Ecco il codice di test:
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());
}
}
Ecco il risultato:
account ID is 0 and for returned account ID is 1
Qui da CrudReporsitory.save() javadoc:
Salva una data entità. Utilizzare l'istanza restituita per ulteriori operazioni poiché l'operazione di salvataggio potrebbe aver modificato completamente l'istanza dell'entità.
Ecco il codice effettivo per SimpleJpaRepository dalla primavera dati JPA:
@Transactional
public T save(T entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Quindi, la domanda è perché abbiamo bisogno di utilizzare l'istanza restituita al posto di quello originale? (sì, dobbiamo farlo, altrimenti continuiamo a lavorare con istanza distaccata, ma perché)
Il metodo originale EntityManager.persist() restituisce void, quindi la nostra istanza è associata al contesto di persistenza. Qualche magia proxy si verifica quando si passa un account per salvare nel repository? È la limitazione dell'architettura del progetto JPA di Spring Data?
Posso presumere che sia sicuro non utilizzare i risultati di ritorno per le nuove entità? – danidacar
Dove si trova qualche documentazione sullo stato dell'oggetto restituito? Ad esempio, a volte restituisce campi aggiornati (timestamp), a volte i campi non vengono aggiornati dal DB. – mmcrae