You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:06:17