【发布时间】: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