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

H2数据库与Spring Data JPA问题:记录不更新、自增ID不连续

问题1:Spring Data JPA无法更新B表记录

原因分析

  1. 异步线程事务缺失:更新操作在CompletableFuture异步线程中执行,默认@Transactional注解不会自动传播到异步线程,导致JPA的更新操作不受事务管理,最终无法提交到数据库。
  2. JPA更新流程错误:从提供的代码看,获取Logenablermodel实体后未执行JPA标准更新逻辑(如调用logenablermodelDao.save()),若实际业务中遗漏此步骤,自然无法触发更新。
  3. 一级缓存干扰:JPA的Session一级缓存会缓存已加载的实体,若更新后未刷新缓存,后续读取可能仍获取旧数据,造成“未更新”的错觉。

解决方案

  • 给异步线程添加事务支持:可手动在异步线程内管理事务,确保更新操作被提交:
@Autowired
private PlatformTransactionManager transactionManager;

CompletableFuture<Object> future = CompletableFuture.supplyAsync(() -> {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        Logenablermodel updateLogEnabler = logenablermodelDao.findAll().get(0);
        updateLogEnabler.setLastLog(endTime); // 修改目标字段
        logenablermodelDao.save(updateLogEnabler); // 触发JPA更新
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        throw e;
    }
    // 其他业务逻辑...
});
  • 使用注解式更新绕过缓存:在Repository中定义带@Modifying的自定义更新方法,避免缓存影响:
@Modifying
@Query("UPDATE Logenablermodel l SET l.lastLog = :endTime WHERE l.id = :id")
void updateLastLogById(@Param("id") Long id, @Param("endTime") String endTime);
问题2:H2自增ID重启后不连续

原因分析

H2 2.x版本默认采用序列预分配优化性能,会提前预取一批自增ID值。应用重启时,未使用的预分配ID会被丢弃,导致下一次插入的ID直接跳至预分配批次的下一个起始值,出现ID不连续的情况。

解决方案

  1. 修改H2连接URL参数:在配置文件中指定全局序列增量为1,禁用预分配:
# application.properties
spring.datasource.url=jdbc:h2:file:./data/h2db;DB_CLOSE_ON_EXIT=FALSE;DEFAULT_SEQUENCE_INCREMENT=1
  1. 针对实体单独配置序列:在实体类的ID字段上指定序列生成器,设置分配大小为1:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "logenabler_seq")
@SequenceGenerator(name = "logenabler_seq", sequenceName = "LOGENABLER_SEQ", allocationSize = 1)
private long id;
  1. 手动调整现有序列:在H2控制台执行SQL修改目标序列的增量:
-- 先查询所有序列名称
SELECT * FROM INFORMATION_SCHEMA.SEQUENCES;
-- 修改对应序列的增量
ALTER SEQUENCE SYSTEM_SEQUENCE_XXXX INCREMENT BY 1;

内容的提问来源于stack exchange,提问作者Sidda Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:35:00