我使用这个实体来记录到数据库中。
@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
在启动应用程序之前,我已使用脚本插入了几行。
我该如何解决这个问题?
当您使用 hibernate 管理对象实例时,它们必须“附加”到会话。
如果你创建一个对象new
您需要首先将其附加到会话,然后才能使用休眠管理它。
当一个对象(带有生成的id)有一个id值时,hibernate期望该对象存在于他的会话中(因为id值只有在hibernate生成它或hibernate通过查询从数据库中获取它时才存在),否则它抛出陈旧异常。
你必须打电话saveOrUpdate
供 hibernate 创建其 Id 并将实例附加到会话(如果数据库中不存在),或者调用load
使用 hibernate 的 id 从数据库中获取实例(如果数据库中存在该实例)。
在这种情况下,您知道 id,因此您必须查询 hibernate 来获取附加实例。所以,试试这个:
SystemUsersModel obj = session.load(SystemUsersModel.class, userlist.getId());
session.delete(obj);
以下是 hibernate 会话的实例方面的不同状态的解释:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html
Edit:感谢@vanoekel
或者更好,而不是load
你可以使用getReference
因为如果您只想事后删除它,那么它在资源方面会更便宜。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)