Đây là mã:Tại sao sử dụng thể hiện được trả về sau khi lưu() trên Kho lưu trữ dữ liệu Spring JPA?
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
JpaRepository từ dự án Spring liệu JPA.
Đây là mã kiểm tra:
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());
}
}
Dưới đây là kết quả:
account ID is 0 and for returned account ID is 1
Đây là từ CrudReporsitory.save() javadoc:
Tiết kiệm một thực thể nhất định. Sử dụng thể hiện được trả về cho các hoạt động tiếp theo khi thao tác lưu có thể đã thay đổi hoàn toàn cá thể thực thể.
Đây là mã thực tế cho SimpleJpaRepository từ mùa xuân dữ liệu JPA:
@Transactional
public T save(T entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Vì vậy, câu hỏi là tại sao chúng ta cần phải sử dụng các trường hợp trở lại thay vì một bản gốc? (vâng, chúng ta phải làm điều đó, nếu không chúng ta tiếp tục làm việc với cá thể tách rời, nhưng tại sao)
Phương thức EntityManager.persist() ban đầu sẽ trả về void, vì vậy cá thể của chúng ta được gắn vào ngữ cảnh bền vững. Có một số phép thuật proxy xảy ra trong khi chuyển tài khoản để lưu vào kho lưu trữ không? Có phải đó là giới hạn kiến trúc của dự án JPA Spring Data?
Tôi có thể cho rằng an toàn không sử dụng kết quả trả về cho các thực thể mới? – danidacar
Một số tài liệu về trạng thái của đối tượng được trả về ở đâu? Tức là, đôi khi nó trả về các trường được cập nhật (dấu thời gian), đôi khi các trường không được cập nhật từ DB. – mmcrae