我使用这个实体来记录到数据库中.
@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因为它在资源方面会更便宜,如果你只是想删除它后.