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
相关产品推荐
相关产品推荐

