Почему я получаю StaleObjectStateException при удалении сущности?

В моем веб-приложении Spring Boot у меня есть контроллер, который предоставляет метод для удаления объекта из базы данных, который в свою очередь вызывает класс 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);
  }
}

DAO:

@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) сразу после добавления сущность выдает исключение, упомянутое выше. Что я делаю неправильно?

1 ответ

Решение

Следуя подсказке PaulNUK, я добавил @Version аннотированное поле для моей сущности. Теперь я получил следующее исключение при добавлении объекта в свою базу данных: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1,

Проблема оказалась в следующем: моя сущность имеет UUID в качестве идентификатора, который был аннотирован следующим образом:

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")

Добавление

@Column(columnDefinition = "BINARY(16)")

решил проблему.

Другие вопросы по тегам