Почему я получаю 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)")
решил проблему.