【问题标题】:Why hibernate delete operation does not work?为什么休眠删除操作不起作用?
【发布时间】:2015-02-19 02:02:14
【问题描述】:

我有一个基本的 Spring MVC 项目,其中包含 User 和 Task 类的经典 dao 设计。我正在为 webapp 使用 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));
}

关于为什么会发生这种情况的任何想法?

当删除方法被调用时,这是日志记录:

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

【问题讨论】:

  • 你有什么东西可以为你处理交易吗?在您的情况下,可能会将事务设置为只读。
  • 我使用的是由spring管理的hibernate事务管理器。也许你是对的,但为什么 create 方法可以通过 webapp 工作?
  • 可能有人编写了一个配置文件,只允许对名称以“save”或“create”开头的方法进行写操作。
  • 我从头开始编写了整个应用程序,所以不,我不记得曾经写过类似的东西。

标签: java spring hibernate


【解决方案1】:

试试这个删除方法:

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

,也许您只需要刷新活动会话即可查看更改。

【讨论】:

    【解决方案2】:

    您可以更改删除方法并尝试一下吗?

    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 关联?

    【讨论】:

    • 我改变了它,但我仍然遇到同样的问题,事实上,在我的控制器中我尝试了这个:System.out.println("\n"+userService.delete(id)+"\n"); 和打印true。 User 和 Task 之间存在一对多的关系。
    • 您能否启用休眠日志并检查日志中出现的内容
    • 用户是否设置了删除级联以执行 db 或 java 级别的任务?
    • 是的,@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE) private Collection&lt;Task&gt; tasks;
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多