【问题标题】:Why do I get a StaleObjectStateException on removing entity?为什么在删除实体时会收到 StaleObjectStateException?
【发布时间】:2017-08-11 19:53:33
【问题描述】:

在我的 Spring Boot Web 应用程序中,我有一个控制器,它提供了一种从数据库中删除实体的方法,该方法又调用 DAO 类。但是,当我调用 entityManager.remove(entity) 时,我收到了一个 StaleObjectStateException,即使 entity 刚刚从数据库中检索到,并且没有其他对我的 API 的调用可能改变了 entity

这是我的控制器:

@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);

甚至在添加实体后立即调用em.remove(res) 也会产生上述异常。我做错了什么?

【问题讨论】:

  • 可能是您的实体缺少未保存的值映射?顺便说一句,你为什么不直接使用 Spring Data JPA 呢?你的 Dao 可以压缩成这样: public interface ChainLevelRepository extends JpaRepository {}
  • 如何添加未保存值映射?我将看看 Spring Data JPA

标签: java jpa spring-boot


【解决方案1】:

按照 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)")

解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多