jpa自定义主键策略 手动指定主键失败

457 阅读1分钟

环境

springdataJpa 2.3.10

hibernate-core: 5.4.30

image-20221121163423855

问题

debug得 自定义策略生效 并且通过了一层判定

image-20221121164431044

AbstractSaveEventListenersaveWithGeneratedId performSave

image-20221121164627510

performSave中重新生成了key,此key即形似数据库中最终保存的主键

image-20221121165201692

随后进入判定

return this.invokeSaveLifecycle(entity, persister, source) ? id : this.performSaveOrReplicate(entity, key, persister, useIdentityColumn, anything, source, requiresImmediateIdAccess);

未通过persister.implementsLifecycle() 判定 返回了false

 protected boolean invokeSaveLifecycle(Object entity, EntityPersister persister, EventSource source) {
        if (persister.implementsLifecycle()) {
            LOG.debug("Calling onSave()");
            if (((Lifecycle)entity).onSave(source)) {
                LOG.debug("Insertion vetoed by onSave()");
                return true;
            }
        }
​
        return false;
    }
public boolean implementsLifecycle() {
        return this.getEntityTuplizer().isLifecycleImplementor();
    }

相关代码

自定义策略

/**
 * 当新数据指定了自定义id时 使用自定义id
 * 参考:
 * https://stackoverflow.com/questions/11667929/jpa-override-auto-generated-id
 * https://jianshu.com/p/db5f10b546df
 */
public class CustomUUIDGenerator extends UUIDGenerator {
  @Override
  public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
    try {
      Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
      if (id != null)
        //TODO 未生效
        return id;
    } catch (Exception e) {
      return super.generate(session, object);
    }
    return super.generate(session, object);
  }
}

指定策略

 @Id
  @GeneratedValue(generator = "custom-uuid-generator")
  @GenericGenerator(name = "custom-uuid-generator", strategy = "com.ect.core.entity.CustomUUIDGenerator")
  @Column(name = "UUID", nullable = false, columnDefinition = "char(32)")
  private String id;

参考链接:

stackoverflow.com/questions/3…

stackoverflow.com/questions/1…

jianshu.com/p/db5f10b54…