Hibernate 错误批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1

Hibernate Error Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

我不明白为什么我会收到这个错误并且我已经用头撞墙几个小时了。

    session.beginTransaction();

    @SuppressWarnings("unchecked")
    List<ActAsUser> actAsUser = (List<ActAsUser>) session.createCriteria(ActAsUser.class)
            .add(Restrictions.eq("actAsID.userID", proxyID))
            .add(Restrictions.eq("actAsID.targetID", targetID))
            .list();

    session.delete(actAsUser.get(0));
    session.getTransaction().commit();

当我试图删除数据库中我没有使用 Hibernate 添加的任何行时,上面的代码给我一个错误,即通过常规 SQL 输入的数据库的所有现有行。

Error: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

如果我在我的应用程序中使用 Hibernate 插入一行,我可以完全删除该行。

我无法理解的是,我首先从数据库中获取一个用户,所以我知道该用户存在。

我检查了 Hibernate SQL,我能看到的唯一区别是运行 select 语句时的以下内容:

工作

/* criteria query */ select
    this_.PROXY_USER_ID as PROXY1_12_0_,
    this_.TARGET_USER_ID as TARGET2_12_0_,
    this_.EFFCT_DATE as EFFCT3_12_0_,
    this_.INCIDENT_NBR as INCIDENT4_12_0_,
    this_.TARGET_USER_NAME as TARGET5_12_0_,
    this_.EXPIRY_DATE as EXPIRY6_12_0_ 

不工作

/* criteria query */ select
    this_.PROXY_USER_ID as PROXY1_16_0_,
    this_.TARGET_USER_ID as TARGET2_16_0_,
    this_.EFFCT_DATE as EFFCT3_16_0_,
    this_.INCIDENT_NBR as INCIDENT4_16_0_,
    this_.TARGET_USER_NAME as TARGET5_16_0_,
    this_.EXPIRY_DATE as EXPIRY6_16_0_ 

列末尾附加的数字有所不同,谁能告诉我这些数字的实际含义以及这是否可能是问题所在,因为这是我在两个查询之间找到的唯一区别。

刚刚解决

删除语句的 Hibernate 查询不工作:

Hibernate: 
/* delete com.package.ActAsUser */ delete 
    from
        CONFIG_ACTAS_PROXY 
    where
        PROXY_USER_ID=? 
        and TARGET_USER_ID=? 
        and EFFCT_DATE=?
13:39:01,460 TRACE BasicBinder:82 - binding parameter [1] as [VARCHAR] - A534651
13:39:01,460 TRACE BasicBinder:82 - binding parameter [2] as [VARCHAR] - A512058
13:39:01,460 TRACE BasicBinder:82 - binding parameter [3] as [DATE] - 2014-11-03

PROXY_USER_ID TARGET_USER_ID EFFCT_DATE A534651 A512058 2014-11-03 04:24:44

这是日期上设置的时间。

通过休眠添加行时,日期如下所示:

2014-11-0300:00:00

我数据库中的其他行看起来像

2014-11-0304:24:44

当我编辑它们并设定时间 00:00:00 时,删除就可以了。

将休眠映射更改为映射到时间戳类型而不是日期也解决了我的应用程序中的问题。