EntityManager的remove方法无法按ID删除对象?问题求助
问题分析与修复方案
你的删除逻辑未生效,核心是代码存在语法错误、参数不匹配及冗余配置问题,逐一说明并修复:
1. UserRegistrator 业务类的语法与逻辑错误
你的delete方法存在两处致命问题:
- 返回的
item变量未定义,编译阶段就会报错,无法执行到删除逻辑 - REST接口调用
userRegistrator.delete(id,item),但业务类的delete方法仅接收long id参数,参数不匹配导致调用失败
修复后的UserRegistrator代码:
@Stateless public class UserRegistrator { @Inject private Logger logger; @Inject private EntityManager entityManager; public User delete(long id){ logger.info("User deleted by " + id); User user = entityManager.find(User.class, id); if (user != null) { entityManager.remove(user); } return user; // 返回被删除的用户,无匹配记录则返回null } }
2. REST接口的冗余配置与参数问题
- DELETE请求无需请求体,你添加的
@Consumes(MediaType.APPLICATION_JSON)和User item参数完全多余,可能引发请求解析异常 - 接口声明
@Produces(MediaType.TEXT_PLAIN)但返回User对象,类型不匹配,需调整注解或返回值类型
修复后的UserRest接口代码:
@DELETE @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public User deleteUserById(@PathParam("id") long id){ return userRegistrator.delete(id); }
3. 事务有效性验证
@Stateless EJB方法默认开启事务,但如果容器配置特殊,可显式添加@Transactional注解确保删除操作在事务内执行:
import javax.transaction.Transactional; @Stateless public class UserRegistrator { // ... 其他代码 @Transactional public User delete(long id){ // ... 删除逻辑 } }
额外验证点
- 确认数据库中存在ID为1的用户记录
- 检查日志输出,确认
User deleted by 1是否打印,判断方法是否被正确调用 - 验证数据库连接配置,确保EntityManager可正常操作数据库
内容的提问来源于stack exchange,提问作者HIZAM
相关产品推荐
相关产品推荐

