在我的Spring Boot Web应用程序中,我有一个控制器,它提供了一种从数据库中删除实体的方法,该实体又调用DAO类。但是,当我致电entityManager.remove(entity)
时,我收到StaleObjectStateException
,即使刚刚从数据库中检索到entity
而且我的API没有其他可能已更改的{{1} }。
这是我的控制者:
entity
DAO:
@Transactional
@RestController
public class AppAdminController {
...
@RequestMapping(value = "/admins/{username}", method = RequestMethod.DELETE)
public void deleteAdmin(@PathVariable("username") String username) {
dao.removeByUsername(username);
}
}
通过调用
添加@Service
public class AppAdminDao extends AbstractDAO<UUID, AppAdmin> {
public AppAdmin getByUsername(String username) {
TypedQuery<AppAdmin> query = em.createQuery("SELECT a FROM AppAdmin a WHERE a.username=:username", AppAdmin.class);
query.setParameter("username", username);
try {
return query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
public void removeByUsername(String username) {
AppAdmin admin = getByUsername(username);
if(admin != null) {
em.remove(admin);
}
}
}
AppAdmin aa
甚至在添加实体后立即调用AppAdmin res = em.merge(aa);
会产生上述异常。我做错了什么?
答案 0 :(得分:2)
根据PaulNUK的提示,我向我的实体添加了一个@Version
注释字段。现在,我在向数据库添加实体时遇到以下异常:org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
。
问题结果如下:我的实体有一个UUID作为id,注释如下:
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
添加
@Column(columnDefinition = "BINARY(16)")
解决了这个问题。