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

Pet*_*zov 7 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;
Run Code Online (Sandbox Code Playgroud)

删除查询:

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();
        }
Run Code Online (Sandbox Code Playgroud)

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

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Run Code Online (Sandbox Code Playgroud)

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

gma*_*jon 10

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

如果您创建一个对象,则new需要先将其附加到会话,然后才能使用hibernate进行管理.

当一个对象(具有生成的id)具有id值时,hibernate期望该对象存在于他的会话中(因为id值只有在hibernate生成它或者hibernate通过查询从数据库中引入它时才存在),否则它抛出陈旧的例外.

您必须saveOrUpdate为hibernate 调用它来创建它的Id并将实例附加到会话中(如果它在数据库中不存在),或者load使用id for hibernate从数据库中引入实例(以防万一)它存在于数据库中).

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

SystemUsersModel obj = session.load(SystemUsersModel.class, userlist.getId());
session.delete(obj);
Run Code Online (Sandbox Code Playgroud)

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

编辑:感谢@vanoekel

或者更好,而不是load你可以使用,getReference因为它在资源方面会更便宜,如果你只是想删除它后.