为什么在删除实体时会出现StaleObjectStateException?

时间:2017-03-20 13:46:16

标签: java jpa spring-boot

在我的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); 会产生上述异常。我做错了什么?

1 个答案:

答案 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)")

解决了这个问题。