我使用这个实体来记录到数据库中。
@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
在启动应用程序之前,我使用脚本插入了几行。 我怎么能解决这个问题?
答案 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)