批量更新从update [0]返回意外的行数;

时间:2017-07-05 18:33:07

标签: java hibernate

我使用这个实体来记录到数据库中。

@Entity
@Table(name = "SYSTEM_USERS")
public class SystemUsersModel implements Serializable
{
    private static final long serialVersionUID = 8432414340180447723L;

    @Id
    @GeneratedValue
    private Integer id;

    @Column
    private String username;

    @Column
    private String email;

    @Column
    @Type(type = "date")
    @Temporal(TemporalType.DATE)
    private Date lastlogin;

    @Column
    private String password;

    @Column
    private String salt;

    @Column
    @Type(type = "date")
    @Temporal(TemporalType.DATE)
    private Date added;

删除查询:

SessionFactory factory = HibernateUtils.getSessionFactory();
        Session session = factory.getCurrentSession();

        try
        {
            session.getTransaction().begin();

            SystemUsersModel obj = new SystemUsersModel();
            obj.setId(userlist.getId());

            session.delete(obj);

            session.getTransaction().commit();

            blacklists.remove(selectedBlackListEntry);
            selectedBlackListEntry = null;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            session.getTransaction().rollback();
        }

然后我运行代码我得到了这个错误:

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

在启动应用程序之前,我使用脚本插入了几行。 我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:10)

当您使用休眠管理对象的实例时,它们必须是"附加"到会议。

如果使用return (c1 < c2) ? -1 : 1; 创建对象,则需要先将其附加到会话,然后才能使用hibernate进行管理。

当一个对象(具有生成的id)具有id值时,hibernate期望该对象存在于他的会话中(因为id值只有在hibernate生成它或hibernate通过查询从数据库中提取时才存在) ,否则它会引发陈旧异常。

您必须在其上调用new以便hibernate创建其ID并将实例附加到会话中(如果它不存在于数据库中),或者调用saveOrUpdate使用hibernate的id从数据库中获取实例(如果它存在于数据库中)。

在这种情况下,您知道id,因此您必须查询hibernate以获取附加实例。所以,试试这个:

load

以下是对hibernate会话的实例方面的不同状态的解释:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html

修改:感谢@vanoekel

或者更好的是,您可以使用SystemUsersModel obj = session.load(SystemUsersModel.class, userlist.getId()); session.delete(obj); 而不是load,因为如果您只是想在之后删除它,那么在资源方面它会更便宜。

答案 1 :(得分:1)

以下行可能会发生异常

如果您的对象具有自动生成的主键,并且您强制分配键可能会导致异常。

请访问此页面了解详细说明HERE