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

Hibernate 6.4.2升级至6.4.4后事务提交前无法获取实体ID求助

Hibernate 6.4.4事务提交前无法获取IDENTITY生成ID的解决方案

问题原因

Hibernate 6.4.3及后续版本对GenerationType.IDENTITY策略的ID生成时机做了优化调整:默认情况下,IDENTITY类型的ID会延迟到事务提交时才生成,而非之前版本中调用persist()时就生成,导致BEFORE_COMMIT阶段无法获取到ID。

可行解决方案

  • 更换ID生成策略(推荐,若数据库支持)
    改用SEQUENCE、TABLE或UUID等提前生成ID的策略,比如SEQUENCE:

    @Entity
    public class A {
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a_seq")
        @SequenceGenerator(name = "a_seq", sequenceName = "a_sequence", allocationSize = 1)
        private Long id;
    }
    

    这类策略会在调用persist()时就生成ID,BEFORE_COMMIT阶段能正常获取。

  • 手动触发flush生成ID
    在发布事件前,调用EntityManager.flush()强制Hibernate执行SQL并生成ID:

    @Autowired
    private EntityManager em;
    @Autowired
    private ApplicationEventPublisher publisher;
    
    @Transactional
    public void saveEntityAndPublishEvent(A a) {
        em.persist(a);
        em.flush(); // 强制生成ID
        publisher.publishEvent(new Event(a));
    }
    
  • 调整事件监听阶段
    若业务允许,将监听阶段改为AFTER_FLUSH——该阶段在flush之后、事务提交之前,此时ID已生成:

    @TransactionalEventListener(phase = TransactionPhase.AFTER_FLUSH)
    public void handleEvent(Event event) {
        Long id = event.getA().getId(); // 可正常获取ID
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:07:10