簡體   English   中英

為什么休眠刪除操作不起作用?

[英]Why hibernate delete operation does not work?

我有一個基本的Spring MVC項目,具有針對User和Task類的經典dao設計。 我正在為Web應用程序使用Hibernate OpenSessionInView過濾器模式; 但是,我的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));
}

為什么會這樣?

調用delete方法時,這是日志記錄:

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=?

您可以更改刪除方法並嘗試一下嗎?

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)調用即可;

是否有任何孩子班級或1tomany或many2many協會?

試試這個刪除方法:

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

,也許您只需要刷新活動會話即可查看更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM