Tôi muốn thử nghiệm phương thức save() của hibernate session bằng cách sử dụng khung kiểm thử mùa xuân. @Test method is:Làm thế nào để tuôn ra dữ liệu vào db bên trong giao dịch mùa xuân đang hoạt động?
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
Tôi muốn xóa người dùng vào cơ sở dữ liệu. Tôi muốn người dùng của tôi là trong cơ sở dữ liệu sau khi phương pháp này
getGenericDao().currentSession().save(expected);
Sau đó, tôi muốn đi đến cơ sở dữ liệu sử dụng khung dữ liệu mùa xuân và lấy này lưu người dùng bằng dòng tiếp theo:
User actual = getUser(generatedId);
Tôi cố gắng để sử dụng hibernate phương pháp tuôn ra như:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
Nó không xóa người dùng của tôi vào cơ sở dữ liệu! Tuy nhiên, nếu tôi không sử dụng chú thích mùa xuân @Transactional và lưu người dùng của tôi trong giao dịch mùa xuân có lập trình, tôi sẽ đạt được những gì tôi muốn. Rất tiếc, người dùng được lưu vào db không được khôi phục vì không có @Transactional mùa xuân. Do đó phương pháp thử nghiệm của tôi thay đổi db và hành vi của các phương pháp thử nghiệm tiếp theo.
Vì vậy, tôi cần xóa người dùng của mình thành phương pháp thử nghiệm bên trong db (không phải ở cuối) và ở cuối phương thức kiểm tra, tất cả thay đổi đối với db.
CẬP NHẬT gợi ý để chuẩn bị phương pháp như sau:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
Và gọi doSave bên testSave đang làm gì. Tôi vẫn không có người dùng trong db sau khi thực hiện phương pháp này. Tôi đặt breakpoint và kiểm tra db của tôi từ dòng lệnh.
CẬP NHẬT Cảm ơn rất nhiều vì đã trả lời. Vấn đề là phương thức flush() không đưa người dùng của tôi vào cơ sở dữ liệu. Tôi đã thử Isolation.READ_UNCOMMITTED và nó không đưa người dùng của tôi vào cơ sở dữ liệu. Tôi có thể đạt được những gì tôi muốn nhưng chỉ khi tôi tắt giao dịch mùa xuân trên phương thức @Test và thực hiện lưu trong giao dịch có lập trình. NHƯNG sau đó phương pháp @Test không được cuộn lại để lại người dùng đã lưu cho các phương thức @Test tiếp theo. Ở đây phương pháp @Test để lưu người dùng không phải là nguy hiểm như phương pháp @Test để xóa người dùng, bởi vì nó không được quay trở lại. Vì vậy, phải có hỗ trợ giao dịch cho phương thức @Test mà tôi không thể đưa người dùng của tôi (hoặc xóa) vào db. Trên thực tế người dùng được đặt (hoặc xóa) vào db chỉ sau khi phương thức @Test kết thúc và giao dịch cho phương thức @Test được đính kèm. Vì vậy, tôi muốn lưu Người dùng của tôi vào db ở giữa phương pháp @Test và quay lại vào cuối phương pháp @Test
Cảm ơn bạn!
Bạn có thể cung cấp cho chúng tôi lớp GenericDao của bạn không? EDIT: thực sự, tôi nghĩ rằng tôi thấy vấn đề. Giao dịch hiện tại cần phải được cam kết trước khi dữ liệu thực sự được lưu vào cơ sở dữ liệu. Vì vậy, bạn cần hai phương pháp @Transactional: một để lưu và một phương pháp khác để tải. –
Hãy nhìn xem nếu tôi đã làm đúng –
Đóng. Tôi có nghĩa là có hai chức năng giao dịch được gọi là bởi một chức năng phi giao dịch. Điều đó sẽ làm việc ... –