У меня есть базовый проект Spring MVC с классическим дизайном dao для классов User and Task. Я использую шаблон фильтра Hibernate OpenSessionInView для webapp; но, мой UserService
не работает должным образом, фактически его операция удаления. Дело в том, что у меня простой модульный тест для этого метода, и он работает нормально, потому что когда я его запускаю, все в порядке, но когда я тестирую через webapp, например: curl -X DELETE "http://myhost:port/users/someUserId"
, операция удаления не работает все, потому что объект сохраняется после его вызова.Почему спящий режим удаления не работает?
Вот часть моего UserService
:
@Override
public <T> User get(String key, T value) {
User u = new User();
switch (key) {
case "id":
u = (User) session.getCurrentSession().get(User.class, (Serializable) value);
break;
case "email":
u = (User) session.getCurrentSession().createQuery("from User u where u.email = :email").setParameter("email", value.toString()).uniqueResult();
break;
case "username":
u = (User) session.getCurrentSession().createQuery("from User u where u.username = :username").setString("username", (String) value).uniqueResult();
break;
}
if (u != null) Hibernate.initialize(u.getTasks());
return u;
}
@Override
public void delete(Integer userId) {
session.getCurrentSession().delete(get("id",userId));
}
и UserController
:
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String deleteMemeber(@PathVariable Integer id) {
userService.delete(id);
return "redirect:/";
}
и тест блок для UserService
удаления:
@Test
public void testUserDeleteService() {
List<User> preUsers = userService.findAll();
User userToDelete = userService.findById(3);
userService.delete(3);
List<User>postUsers = userService.findAll();
assertNotEquals(preUsers, postUsers);
assertEquals(preUsers.size() - 1, postUsers.size());
assertFalse(userService.findAll().contains(userToDelete));
assertNull(userService.findById(3));
}
Любые идеи, почему это происходит?
Когда метод удаления называется, это протоколирование:
Hibernate: select user0_.id as id1_1_0_, user0_.email as email2_1_0_, user0_.first_name as first_na3_1_0_, user0_.last_name as last_nam4_1_0_, user0_.password as password5_1_0_, user0_.role as role6_1_0_, user0_.enabled as enabled7_1_0_, user0_.username as username8_1_0_ from users user0_ where user0_.id=?
Hibernate: select user0_.id as id1_1_0_, user0_.email as email2_1_0_, user0_.first_name as first_na3_1_0_, user0_.last_name as last_nam4_1_0_, user0_.password as password5_1_0_, user0_.role as role6_1_0_, user0_.enabled as enabled7_1_0_, user0_.username as username8_1_0_ from users user0_ where user0_.id=?
Hibernate: select tasks0_.user_id as user_id6_1_0_, tasks0_.id as id1_0_0_, tasks0_.id as id1_0_1_, tasks0_.created_on as created_2_0_1_, tasks0_.deadline as deadline3_0_1_, tasks0_.description as descript4_0_1_, tasks0_.name as name5_0_1_, tasks0_.user_id as user_id6_0_1_ from tasks tasks0_ where tasks0_.user_id=?
Hibernate: select tasks0_.user_id as user_id6_1_0_, tasks0_.id as id1_0_0_, tasks0_.id as id1_0_1_, tasks0_.created_on as created_2_0_1_, tasks0_.deadline as deadline3_0_1_, tasks0_.description as descript4_0_1_, tasks0_.name as name5_0_1_, tasks0_.user_id as user_id6_0_1_ from tasks tasks0_ where tasks0_.user_id=?
У вас есть что-то, что обрабатывает транзакции для вас? Возможно, он устанавливает транзакцию только для чтения в вашем случае. –
Я использую менеджер транзакций спящего режима, управляемый весной. Возможно, вы правы, но почему метод create работает через webapp? –
Возможно, кто-то написал файл конфигурации, чтобы разрешить операции записи только для методов, имя которых начинается с «сохранения» или «создания». –