kiểm tra chú thích mùa xuân với @Transactional là thuận tiện nhưng nó không phải là cách mã sản xuất của bạn sẽ được thực thi. Chú thích @Transactional sẽ bắt đầu một giao dịch trước khi chạy phương thức thử nghiệm của bạn và nó sẽ cuộn nó trở lại khi phương thức thử nghiệm kết thúc.
Trong khi cam kết được đi trước bằng lệnh tuôn ra, thì việc khôi phục không được, do đó, việc xả thủ công là cơ chế an toàn để đảm bảo tất cả thay đổi thực thể được dịch sang câu lệnh SQL.
Một thiết kế thích hợp hơn sẽ được vẽ ranh giới giao dịch một cách rõ ràng như thế này:
@Test
public void testRootObjects() {
final Company newCompany = new Company();
newCompany.setName("TV Company");
final Long companyId = transactionTemplate.execute(new TransactionCallback<Long>() {
@Override
public Long doInTransaction(TransactionStatus transactionStatus) {
entityManager.persist(newCompany);
return newCompany.getId();
}
});
Company detachedCompany = transactionTemplate.execute(new TransactionCallback<Company>() {
@Override
public Company doInTransaction(TransactionStatus transactionStatus) {
Company attachedCompany = entityManager.find(Company.class, companyId);
assertEquals(newCompany, attachedCompany);
assertEquals(newCompany.hashCode(), attachedCompany.hashCode());
return attachedCompany;
}
});
assertEquals(newCompany, detachedCompany);
assertEquals(newCompany.hashCode(), detachedCompany.hashCode());
}
Các TransactionTemplate sẽ cam kết mã của bạn nên không cần thiết phải bừng bằng tay.
Nếu bạn gọi phương thức dịch vụ @Transactional thông qua giao diện của chúng, bạn sẽ không cần transactionTemplate chút nào, vì bạn đang gọi một proxy Spring sẽ gọi TransactionInterceptor (giả sử bạn hướng dẫn Spring nhận biết chú thích giao dịch) và do đó các giao dịch sẽ được bắt đầu/cam kết nhân danh bạn.
Nguồn
2014-05-15 09:06:05
Pascal, cảm ơn. Đề nghị ở đây là gì? flush() sau khi lưu và tránh cache cấp đầu tiên khi hiệu năng không phải là vấn đề lớn? Và chúng ta có nên kêu gọi tuôn ra sau khi gọi phương thức được thử nghiệm bên ngoài cuộc gọi phương thức hoặc thậm chí bên trong không? Làm thế nào khó hiểu! – JavaRocky