Spring Boot中无法通过ID删除单个Agency数据的问题求助
问题分析与解决方案
1. 核心问题:DELETE查询未执行
你的deleteById方法里创建了HQL删除查询,但没调用executeUpdate()触发执行,数据库里的记录根本不会被删除。这也是批量删除deleteAll能生效的原因——它调用了executeUpdate()。
修改后的deleteById方法:
@Transactional public boolean deleteById(Integer id) { Session session = getSession(); Transaction transaction = session.beginTransaction(); // 关键:调用executeUpdate()执行删除语句 int affectedRows = session.createQuery("DELETE FROM AgenciesEntity WHERE id=:id") .setInteger("id", id) .executeUpdate(); transaction.commit(); session.close(); // 手动关闭session,避免资源泄漏 return affectedRows > 0; // 返回实际是否删除了数据 }
2. 潜在问题:Session管理混乱
- 你在
deleteById里先session = getSession();,之后又调用getSession(),这会生成两个独立的Session实例:事务在第一个Session开启,查询却在第二个Session执行,事务完全不生效。 - 抽象类
HibernateInteractions的构造函数初始化了session,但静态方法getSession()每次都调用openSession(),会导致大量未关闭的Session,造成资源浪费。建议统一Session的获取和关闭逻辑,或者直接用Spring的EntityManager替代手动Hibernate操作。
3. 事务注解冲突
你手动管理Hibernate Transaction的同时,又加了@Transactional注解,这会导致事务管理逻辑冲突。要么去掉手动事务代码,完全依赖Spring的声明式事务;要么删掉@Transactional,手动处理事务的开启、提交和回滚。
4. Controller接口优化
- 当前
@DeleteMapping()未指定路径,不符合REST规范,建议改为@DeleteMapping("/{id}"),用@PathVariable接收ID,替代@PathParam。 - 每次请求都new一个
AgenciesDao会重复创建SessionFactory,严重影响性能。应该给AgenciesDao加@Repository注解交给Spring容器管理,再用@Autowired注入到Controller中。
优化后的Controller示例:
@RestController @RequestMapping("/agencies") public class AgenciesController { @Autowired private AgenciesDao agenciesDao; @DeleteMapping("/{id}") public ResponseEntity<String> deleteAgencyById(@PathVariable Integer id) { boolean deleted = agenciesDao.deleteById(id); return deleted ? new ResponseEntity<>("删除成功", HttpStatus.OK) : new ResponseEntity<>("未找到对应事务所", HttpStatus.NOT_FOUND); } @DeleteMapping("/name/{name}") public ResponseEntity<String> deleteAgencyByName(@PathVariable String name) { boolean deleted = agenciesDao.deleteByName(name); return deleted ? new ResponseEntity<>("删除成功", HttpStatus.OK) : new ResponseEntity<>("未找到对应事务所", HttpStatus.NOT_FOUND); } }
5. 额外建议
直接使用Spring Data JPA替代手动Hibernate操作,它能自动处理Session、事务和CRUD逻辑,大幅减少重复代码,避免这类低级错误。
内容的提问来源于stack exchange,提问作者maximelonguepe
相关产品推荐
相关产品推荐

