2015-02-18 3 views
1

У меня есть базовый проект 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=? 
+0

У вас есть что-то, что обрабатывает транзакции для вас? Возможно, он устанавливает транзакцию только для чтения в вашем случае. –

+0

Я использую менеджер транзакций спящего режима, управляемый весной. Возможно, вы правы, но почему метод create работает через webapp? –

+0

Возможно, кто-то написал файл конфигурации, чтобы разрешить операции записи только для методов, имя которых начинается с «сохранения» или «создания». –

ответ

0

Попробуйте этот метод удаления:

@Override 
public void delete(Integer userId) { 
    session.getCurrentSession().delete(get("id",userId)); 
    session.getCurrentSession().flush(); 
} 

, может быть, вам просто нужно очистить вашу активную сессию, чтобы увидеть изменения.

+0

Это сработало: D спасибо большое! –

+0

Добро пожаловать :) – Vercryger

0

вы можете изменить метод удаления и попробовать это?

private boolean deleteById(Class<?> type, Serializable id) { 
Object persistentInstance = session.load(type, id); 
if (persistentInstance != null) { 
    session.delete(persistentInstance); 
    return true; 
} 
return false;} 

просто вызывают с помощью deleteById (User.class, ID);

Есть ли какие-либо дочерние классы или 1томаны или многие другие ассоциации?

+0

Я изменил его, но, по-прежнему, у меня все тот же вопрос, в моем контроллере я пробовал это: 'System.out.println (" \ n "+ userService.delete (id) +" \ n ");' и напечатайте 'true'. Между пользователем и Задачей существует соотношение между 1 и многими. –

+0

Можете ли вы включить ведение журнала в спящем режиме и проверить, что происходит в журналах – learningJava

+0

есть ли у вас набор каскадов для удаления на db или на уровне java? – learningJava